NoSQL в SQL Server


28

Этот вопрос не о разнице между SQL и NoSQL. Я ищу какое-то обоснование для чего-то, что действительно не имеет смысла для меня в данный момент (возможно, из-за моего отсутствия понимания или оценки).

Мы начали новый проект с нуля, используя сначала MVC5, код Entity Framework 6 и SQL Server 2008. Когда архитектор рассмотрел схему базы данных, было заявлено, что все внешние ключи и другие подобные ограничения должны быть удалены, поскольку это «бизнес-логика» и следует применять в рамках бизнес-уровня кода приложения.

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

Вторым аргументом является цель - принять NoSQL-подход к данным. Я обнаружил, что это действительно необычно и неортодоксально: учитывая использование SQL-Server 2008, необходимость создания отчетов, данные, не масштабируемые до терабайт, и отсутствие внимания к таким технологиям, как Mongo, Raven и т. Д.

Кто-нибудь сталкивался с таким сценарием раньше? Зачем кому-то применять NoSQL-подход в SQL Server, предназначенном для ссылочных данных, и не хотеть внешних ключей?


21
Поговорите с вашим системным архитектором об обосновании его совета. Либо у него есть очень веская причина, которая применима к вашему конкретному случаю (причина, которую мы не обязательно сможем угадать, не зная точно, из чего состоит ваше приложение), либо он просто некомпетентен.
Арсений Мурзенко

23
Я видел много баз данных, реализованных подобным образом: никаких FK, никаких ограничений CHECK - каждый раз, когда это были базы данных, разработанные неопытными программистами, которые ничего не знали об архитектуре баз данных, ссылочной целостности и т. Д. Но вам важно обсудить это с ваш коллега, вместо того, чтобы просто предполагать, что он некомпетентен.
Арсений Мурзенко

5
Я немного смущен; Вы упоминаете об использовании инфраструктуры Entity (сначала код) ... не означает ли это, что вы создаете объекты (в смысле C #), а затем позволяете платформе Entity обрабатывать создание эквивалентов базы данных, в этом случае попытка добавить / удалить FK и т. д. упражнение в попытке перехитрить Entity Framework (что-то вроде цитаты Марка Твена о попытке научить свинью петь?)
Foon

2
Слишком много людей, которые называют себя «архитекторами», но на самом деле не имеют опыта в кодировании или обслуживании больших систем.
Док Браун

2
Соответствующий: thedailywtf.com/articles/The-Mythical-Business-Layer . «Если подумать, то практически каждая строка кода в программном приложении - это бизнес-логика». Это распространяется на базу данных. «Но так же важно - если не более - иметь в виду, что почти весь код приложения будет бизнес-логикой. Там уже достаточно инструментов; вашему приложению не нужен общий уровень » (выделено мной). Человек, рекомендующий это, вероятно, пытается превратить базу данных в один такой общий уровень. Короче говоря, они, скорее всего, ставят модные слова выше реальности.
jpmc26

Ответы:


74

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

Тогда он идиот, и некоторые выдержки из вашей кодовой базы, вероятно, когда-нибудь окажутся в The Daily WTF . Вы абсолютно правы в том, что его подход не имеет смысла, и, честно говоря, его объяснение также не имеет смысла.

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


17
У меня был немного более дипломатичный ответ, который пытался найти (вменяемую) причину, по которой архитектор мог это делать. Трезвый размышления, я вместо этого получаю на борту этот ответ
Blrfl

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

5
@Kzqai также есть архитектор, в корне неправильно понимающий архитектуру. Это начинает звучать как директива 595, и да, если кто-то хочет заставить меня использовать молотки, чтобы вставить винты в кусок дерева, я найду кого-то, кто не заставляет меня неправильно использовать инструменты для создания чего-либо.

4
Ссылочная целостность является основной темой в теории баз данных, не говоря уже о всех базах данных, которые поддерживают ее в реальном мире. Очевидно, что коллега Энди прав в своем анализе, остальная часть академического и профессионального мира на 100% ошибочна. Бонусные баллы за упоминание The Daily WTF .

2
@AndyClark Вы должны выйти из-за этого. Причина в том, что это ядерная бомба замедленного действия в ядре вашей компании. Это только вопрос времени, когда фекальные массы воздействуют на вентилятор. Когда это произойдет, вам повезет работать в 72-часовую смену, в худшем случае вы будете искать работу ... лучше искать работу, когда у вас есть доход.
Артс

2

У меня еще есть причина для создания внешнего ключа

- Джоэл Спольски

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

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

Смотрите также Что не так с внешними ключами?


Но они не соответствуют причинам в вашем вопросе.

Это бизнес-логика и должна применяться на бизнес-уровне.

Эта причина немного странная. Уникальность и другие ограничения целостности в значительной степени являются областью базы данных ACID. Код вашего приложения не может приблизиться к гарантиям атомарности и целостности SQLServer. Если вам нужна строгая целостность данных, вы будете глупы игнорировать базу данных.

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

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


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

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

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


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

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

3
В контексте фактической цитаты Джоэла такие технологии, как LINQ, дают повод для беспокойства по настройке внешнего ключа. Джоэл не является администратором базы данных, и, от поиска в его блоге до того, как я долгое время читал, я не могу найти от него ничего, говорящего на эту тему или пытающегося дать совет по оптимизации баз данных, проектированию моделей данных и т. Д. Джоэл потрясающий , но он не сейчас и никогда не был - или утверждал, что был! - эксперт в области баз данных или моделирования данных. Это все равно, что процитировать Эйнштейна по поводу сложных процентов - или, если на то пошло, бутербродов. (Ссылка XKCD, пожалуйста.) :)
BrianH

4
Джоэл Спольски известен своими сильными и противоречивыми мнениями. См. FogBugz написан на проприетарном языке ; Внедрение зависимостей слишком сложно (кстати, это был самый противоречивый ответ на Stackoverflow перед закрытием) ; Базы данных XML работают медленно ; и т. д.
BlueRaja - Дэнни Пфлугхофт

2
@BlueRaja: Умм ... Базы данных XML работают медленно, особенно по сравнению с реляционными базами данных. С каких пор это противоречиво или мнение?
Мейсон Уилер
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.