Должна ли моя многосерверная СУБД или мое приложение обрабатывать ссылочную целостность базы данных?

16

Должны ли такие элементы, как внешние ключи, ограничения, значения по умолчанию и т. Д., Обрабатываться системой управления базами данных (в данном случае MS SQL 2005) или приложением? Я слышал мнения с обеих сторон, и я честно не уверен, в какую сторону идти.

Есть вероятность, что мы будем использовать несколько серверов / баз данных, и я не думаю, что внешние ключи могут использоваться на связанных серверах. В дополнение к этому, в дизайне базы данных есть некоторые циклические ссылки, которые не позволяют мне использовать ON UPDATE CASCADEвсе.

База данных - MS SQL 2005 (возможно, 2008), и все взаимодействия с ней должны проходить через приложение.

Рейчел
источник
3
У меня есть кое-что, чтобы изучить здесь, поскольку я не могу вообразить не использование RDBMS.
bigtang

Ответы:

10

Если есть вероятность, что БД будет изменена за пределами вашего приложения, вам нужны ограничения в базе данных. Если БД есть и всегда будет не более чем бэкендом приложения, вы можете их оставить, хотя я бы на всякий случай задокументировал их и, возможно, просто оставил их, если производительность не была слишком плохой. (Программное обеспечение Peoplesoft работает таким образом - ограничения в программном обеспечении, и (я не придумываю это) все это работает как SYS на Oracle.)

Вы хотите, чтобы такие вещи отслеживались приложением, чтобы оно могло реагировать разумно, а не в лучшем случае отправлять пользователю сообщение об ошибке базы данных.

И да, это двойное покрытие, но без него вы, вероятно, получите предотвратимое повреждение данных или плохой пользовательский интерфейс.

Дэвид Торнли
источник
5

В идеале оба. Вам не нужно, чтобы БД справлялась с этим, но опять же, если приложение выдает данные, которые БД отклонит, это ошибка времени выполнения, поэтому приложение должно иметь по крайней мере некоторый код, предназначенный для сохранения ссылочной целостности. Кроме того, установка правильных ограничений в SQL в БД намного проще, чем настройка кода для него на стороне клиента, поэтому выполнение этого в БД значительно сокращает объем работы, которую вам необходимо выполнить.

Мейсон Уилер
источник
1

Если это важно, пусть база данных справится с этим. Таким образом, вам не нужно беспокоиться о том, что кто-то получит доступ к базе данных вне вашего приложения и заменит или введет некоторые противоречивые или дублирующие данные. Если это не какой-то высокоуровневый материал, специфичный для приложения (например, «только пользователи в отделе X, имеющие класс доступа ZZZ, должны иметь право принадлежать к группе 999»), но это обычно не называют «ссылочной» целостностью.

TMN
источник
1

Я бы сказал, положить в базу данных. Если вы используете постоянный фреймворк, он автоматически подберет ключи.

Lareau
источник
1

И то, и другое определенно - путь. Вам понадобится логика проверки в вашем коде, чтобы предотвратить неправильные обновления и вставки, а также сообщить пользователям, что случилось и как это исправить. И наличие базы данных для того, чтобы что-то задним числом сделать так, чтобы, если что-то входило и не проходило проверку, это не сломало бы ситуацию, это хорошая вещь.

Вы должны держать базу данных на более высоком уровне. Например, обеспечить ссылочную целостность и, возможно, некоторые не нулевые. Но не беспокойтесь об ограничении длин или форматов, так как это лучше всего передать приложению полностью.

Уайетт Барнетт
источник