Подтвердить что ты не робот

Должна ли применяться ссылочная целостность?

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

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

Ответ 3

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

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

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

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

Ответ 4

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

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

Ответ 5

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

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

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

Ответ 6

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

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

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

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

Ответ 7

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

Ответ 8

Что сказали paxdiablo и dportas. И мои два цента. Есть еще два соображения.

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

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

Ответ 9

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

Ответ 10

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

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

Ответ 11

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

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

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