Должна ли соблюдаться ссылочная целостность? - PullRequest
21 голосов
/ 23 августа 2010

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

Поскольку отношения поддерживаются на уровне бизнес-логики в любом случае, это просто делает их избыточными для db, чтобы сделать это. Что вы думаете об этом?

Ответы [ 11 ]

24 голосов
/ 23 августа 2010

База данных отвечает за данные. Вот и все. Период.

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

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

9 голосов
/ 23 августа 2010

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

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

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

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

8 голосов
/ 23 августа 2010

Отношения могут поддерживаться на уровне a бизнес-логики.Если вы не можете гарантировать на 100% никаких сомнений в том, что ваш BLL исправен и всегда будет безошибочным, у вас нет целостности данных.И вы не можете дать такую ​​гарантию.

Кроме того, если другое приложение когда-либо коснется вашей базы данных, не обязательно следовать (читай: переопределение, может быть, слегка неправильно) правилам в вашем BLL, Это может повредить данные, даже если вам каким-то образом удалось стать одним из 3-х программистов на Земле, написавших безошибочный код.

База данных, тем временем, применяет одинаковые правила для всех- и правила, применяемые базой данных, гораздо менее вероятно будут упущены при обновлении, поскольку БД не допустит этого.

5 голосов
/ 23 августа 2010

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

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

4 голосов
/ 23 августа 2010

Предположение о производительности, на котором основан вопрос, является неверным, как правило. Обычно, если вам требуется принудительное применение RI, то база данных - это наиболее эффективное место, а НЕ приложение - в противном случае приложение должно запрашивать больше данных, чтобы иметь возможность проверять RI вне базы данных.

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

Наконец, стоимость поддержания ограничений целостности в каждом приложении, как правило, дороже и сложнее, чем делать это один раз в одном месте.

3 голосов
/ 11 июня 2013

Но полковник Ингус, если у вас есть клиент с идентификатором в сеансе, вы уже исследовали базу данных! Проблема заключается в том, что вы потом пишете свой заказ на продажу, но не прикрепляете его к продукту, потому что не проверяли продукт. Так или иначе, вы получите осиротевшие записи, как в очень большой компании, в которой я сейчас работаю. У нас есть клиенты без истории и без клиентов; клиенты с выдающимся балансом, которые никогда ничего не покупали, и товары, проданные клиентам, которых не существует, - интересные бизнес-концепции - и это позволяет команде очень разочарованных сотрудников службы поддержки работать полный рабочий день, пытаясь разобраться в этом. Было бы гораздо дешевле поставить RI на все и купить большую коробку, чтобы разобраться в любых проблемах с производительностью.

3 голосов
/ 23 августа 2010

Много уже было сказано о том, что БД должна быть последним местом для проверки / контроля ваших ограничений (и я не могу согласиться больше)

Если данные важны, то ваше приложение не будет последним, кто получит доступ к базе данных, и не будет единственным.

Но есть еще один очень важный факт о ссылочной целостности (и других ограничениях): он документирует вашу модель данных и делает зависимости между таблицами явными.

Что касается производительности, то определение FK (или других ограничений) в базе данных может сделать вещи еще быстрее в определенных случаях, потому что СУБД может полагаться на ограничения и проводить оптимизации.

2 голосов
/ 23 августа 2010

Что говорили Паксдиабло и Дпортас. И мои два цента. Есть два других соображения.

Чтобы проверить ссылочную целостность для новой вставки, необходимо выполнить проверку в базе данных, чтобы убедиться, что ссылка действительна. Вы просто обнулили прирост производительности, что привело к желанию обеспечить целостность приложения. На самом деле быстрее позволить СУБД обеспечить ссылочную целостность.

Помимо этого, рассмотрим случай, когда у вас есть несколько приложений, все считывающие и записывающие данные в одной базе данных. Если вы применяете ссылочную целостность на уровне бизнес-приложений, вы должны убедиться, что все приложения работают правильно. В противном случае какое-то неправильное приложение может хранить недопустимые ссылки, и проблема может появиться, когда другое приложение перейдет к использованию данных. Это настоящий беспорядок. Лучше иметь СУБД для обеспечения соблюдения правил данных для всех приложений.

1 голос
/ 08 апреля 2011

Что происходит, когда вы пытаетесь вставить запись в базу данных, и она не справляется со ссылочной целостностью?Вы получаете ошибку из базы данных.Затем вы должны изменить свой код, чтобы он не пытался вставить неверные данные.Чтобы избежать ошибок целостности ссылок, ваш код ДОЛЖЕН знать, какие данные какие.Поэтому ссылочная целостность бесполезна.

Уолтер Митти сказал: «Чтобы проверить ссылочную целостность для новой вставки, вы должны выполнить проверку в базе данных, чтобы убедиться, что ссылка действительна».Вздох ... это полная чушь.Если у меня есть объект Customer в сеансе (это память, то есть RAM для некоторых из вас), я знаю идентификатор Customer и могу использовать его для вставки объекта SalesOrder.Нет необходимости искать клиента.

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

1 голос
/ 23 августа 2010

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

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

...