Может ли схема базы данных SQL Server всегда применять бизнес-логику своего приложения с помощью внешних ключей и проверять только ограничения?
Спасибо за ваши предыдущие ответы, но на основе их отзывов я исправил вопрос.
Если ответ на вопрос "нет", то можно обеспечить целостность данных любым другим способом. Я не считаю использование хранимых процедур достаточным, поскольку их можно обойти. Будут ли необходимы триггеры?
5 ответов
Нет. Существует множество бизнес-правил, которые не могут быть представлены только ограничениями CHECK и FOREIGN KEY. На практике даже поддержка ограничений ссылочной целостности в SQL чрезвычайно ограничена.
Например, учитывая две таблицы, называемые "Сотрудник" и "Отдел", я легко могу применить правило, согласно которому каждый сотрудник должен быть назначен только одному отделу, но я также не могу применить правило, согласно которому на каждый отдел должен ссылаться хотя бы один сотрудник. Технически я могу создать ограничения для этого, но тогда SQL не позволит мне обновить таблицы!
Стандарт SQL ISO имеет функцию CREATE ASSERTION, которая должна использоваться для принудительного применения ограничений общего назначения, но большинство СУБД не поддерживают ее. Даже если бы она была доступна, функция CREATE ASSERTION ограничена отсутствием базовой поддержки множественных назначений в SQL - вы можете обновлять только одну таблицу за раз. Эффективное применение бизнес-правил требует модели базы данных, которая допускает множественное назначение.
Нет. Некоторая бизнес-логика предполагает расчеты Конечно, СУБД могут выполнять вычисления, но это будет "с помощью встроенных функций", а не ссылочной целостности.
Сноска в самой последней книге Дейта "Исследование баз данных" отвечает на этот вопрос:
"Стоит отметить, что этот факт подразумевает, что все возможные ограничения базы данных могут быть выражены как IND".
IND являются "зависимостями включения", и они в основном те же, что и внешние ключи SQL, но с учетом ограничений, наложенных SQL.
РЕДАКТИРОВАТЬ
В ответ на "потребуются ли триггеры": "Прикладная математика для специалистов по базам данных" содержит полную специальную главу о том, как программировать триггеры для принудительного применения на практике любого произвольного бизнес-правила. Одна только эта глава делает книгу достойной денег.
Кстати, sprocs не обходятся, если вы используете систему безопасности, чтобы заблокировать весь "прямой" доступ к таблицам. Конечно, вы должны зависеть от того, правильно ли определены и управляются ваши правила безопасности...
В терминах SQL ограничения ссылочной целостности обычно означают внешние ключи.
Возможно, вы имели в виду ограничения целостности данных? Если это так, то мы, вероятно, должны расширить ваше определение, чтобы включить CREATE ASSERTION
и, возможно CREATE DOMAIN
, Это позволило бы применять ограничения произвольной сложности. Однако "любая данная бизнес-логика" на практике является необоснованным требованием, и применение каждого бизнес-правила на уровне СУБД может быть нежелательным.
Спасибо за ваш вклад. Тем не менее, меня особенно интересовали внешние ключи и проверки ограничений.
Могу я спросить, почему? На первый взгляд это кажется произвольной произвольной классификацией.
Это будет зависеть от того, CHECK
ограничения, которые вы имеете в виду, поддерживают подзапросы. Если да, то это по-прежнему допускает ограничения произвольной сложности, но будет срабатывать только при обновлении таблицы, т.е. если CHECK
определение ограничений включает в себя две таблицы, а затем дополнительные CHECK
ограничение может потребоваться на второй таблице.
Тем не менее, я не знаю продукта SQL промышленного уровня, который поддерживает подзапросы (Access Database Engine делает, но я не считаю его промышленным). Однако многие продукты SQL предоставляют в качестве обходного пути поддержку подзапросов (и процедурный код, а также многое другое). Возможно, ваше определение должно позволить тиграм.
Можно было бы иметь всю логику на уровне базы данных, но не с простой схемой базы данных. Вы можете реализовать всю эту логику на уровне базы данных с помощью хранимых процедур и триггеров, но это может быть:
- сложно реализовать
- трудно поддерживать
- медленный, поскольку вся обработка будет выполняться на сервере и не будет использовать мощность клиентских машин.
Я думаю, что вам было бы гораздо лучше реализовать бизнес-логику с помощью хранимых процедур, но опять же, вы могли бы разместить большую нагрузку на свой сервер (зависит от количества клиентов, транзакций и т. Д.).