Обеспечение целостности базы данных


19

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

Насколько можно повысить производительность, если не обеспечить целостность базы данных с помощью внутренних инструментов базы данных?

Ответы:


24

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

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

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

Если вы используете систему реляционных баз данных, я говорю, почему бы не использовать ее на самом деле. Если вам не нужны реляционные данные, используйте Hadoop или что-то еще.


2
Это в значительной степени соответствует тому, что я думал и ожидал. Я знал, что администратор базы данных на моей предыдущей работе ошибался, просто хотел получить независимое мнение по этому поводу. Благодарность!
Ренатс Стозковс

17

Многие разработчики приложений так считают.

Когда вы испытываете желание делегировать целостность данных коду приложения, подумайте: «Каждый программист и каждое приложение, которое обращается к этой базе данных с настоящего момента до конца времени, должно каждый раз получать ее совершенно правильно».

Каковы шансы?


5
+1. Это в основном это так. Вы заменяете хорошо протестированную центральную систему требованием, которого должны придерживаться тонны программистов. Каждый раз. Этого не произойдет, так что со временем вы получите базы данных с неверными данными.
TomTom

13

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

Давно прошли те времена, когда база данных была тупым хранилищем данных. Используйте всю мощь, предлагаемую СУБД.

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


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

5
@TomTom Переписывание логики целостности данных в вашем приложении - это работа, которая уже проделана в RDBMS. Храните логику данных в базе данных.
Томас Стрингер

@TomTom - «Теоретически неверные данные никогда не попадут в базу данных, но целостность - это последняя линия защиты». Согласовано. Эта необычная форма AJAX избавит ваших конечных пользователей от головной боли, предварительно проверив их ввод. Аналогичным образом, эти ограничения базы данных сэкономят вашему бизнесу и вашим инженерам столько же времени, денег и энергии, сколько нужно для очистки после плохого кода .
Ник Чаммас

6

Обычной практикой является удаление ограничений (внешних ключей, CHECK и т. Д.) И индексов, если вы выполняете достаточно большую загрузку данных, и затем повторно включите / внедрите ограничения и индексы. Эта проверка имеет временные затраты. Это предполагает, что вы не можете использовать специфический синтаксис массовой загрузки базы данных (включая минимизацию журналирования).

Невозможно сказать, сколько ожидаемого увеличения производительности - каждая ситуация уникальна (типы данных, дизайн и т. Д.). Единственный способ по-настоящему узнать это проверить.


1
+1. Обратите внимание, что это особый случай - в общем случае данные не обрабатываются и предполагают, что данные верны и в любом случае будут выполняться на шаге воссоздания индекса. Это совершенно техника уровня хранилища данных.
TomTom

3

Есть несколько раз, когда ограничения мешают:

  1. Когда вам нужно использовать Single Table Inheritance (STI). Представьте, что вы продаете как частным лицам, так и организациям. Вам понадобится одна таблица «Вечеринка», строка которой будет индивидуальной или организационной. STI означает, что вам нужны некоторые пустые поля, которые не должны быть нулевыми. Наследование таблиц классов решает эту проблему, но для некоторых ORM это сложнее. Например, ActiveRecord в Ruby поддерживает только STI.

  2. Когда вам нужно поддерживать черновые версии сущностей, это может быть не совсем корректно. Вы можете сохранить черновик как json, но тогда будет сложнее повторно использовать тот же идентификатор на клиенте - представьте, что он был сохранен с id = 5, отредактирован, чтобы быть недействительным, и автоматически сохранен как draftid = 99. В этом случае все ваши поля, вероятно, должны быть обнуляемыми.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.