Мне нужны некоторые предложения для реализации бизнес-правила - сохранять ли его в БД (используя TRIGGER) или в коде приложения.
--- Table structure:---
# ORG - Master table for Organizations
# USER - Master table for Users (each user belongs to an Org so there's a field OrgId which is FK ro ORG)
# SITE - Master table for Sites
# ORGSITE - {OrgId, SiteId} links Site(s) with Org(s)
# USERSITE - {UserId, SiteId} links Site(s) with User(s)
Ограничение заключается в следующем: «Сайт доступен ТОЛЬКО пользователю, если он доступен для его организации».
Теперь в приложении случается, что в день 1 мы связываем Site1 с Org1, а затем мы можем связать Site1 с User1 (User1 принадлежит Org1). На второй день я удаляю связь между Site1 и Org1 из ORGSITE (для этого необходимо также удалить соответствующую связь User1 & Site1 из таблицы USERSITE).
Это обрабатывается из кода приложения. Итак, теперь мой вопрос заключается в том, где я оставлю вышеупомянутую обработку ограничений -
ПОДХОД # 1:
Развертывание TRIGGER в таблице ORGSITE и таблице USER, которые будут обрабатывать действия для:
Вкл. После удаления для ORGSITE (удалить
соответствующие записи USERSITE)
После обновления для ПОЛЬЗОВАТЕЛЯ (если пользователь
Орг изменился, тогда удали его все
записи с USERSITE)
ПОДХОД # 2:
Обработайте все внутри кода - нажмите на события, которые запускают эти действия БД, и удалите записи с USERSITE (по мере необходимости). Нужно управлять через транзакцию.
ПОДХОД # 3:
Просто добавьте новое поле OrgSiteId в таблице USERSITE, которое является ссылкой FK, на «Auto Increment PK: Id» ORGSITE. Далее я разверну каскадное удаление для USERSITE.OrgSiteId FK. Это будет обрабатывать большинство вещей и делать это неявным!
Надеюсь, я хорошо объясню. Подход № 3 действительно сработает? Если нет - какие у вас предпочтения и почему?
Спасибо за ваше время.