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 Framework (спочатку код) ... це не означає, що ви створюєте Об'єкти (у сенсі C #), а потім дозволяєте Entity Framework обробляти побудову еквівалентів бази даних; у цьому випадку намагається додати / видалити 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-годинною зміною, найгірший сценарій, коли ви шукаєте роботу ... краще шукати роботу, коли маєте дохід.
ArTs

2

У мене ще немає причин створити іноземний ключ

- Джоел Спольський

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

  • Продуктивність. Проведення перевірок цілісності за допомогою атомних транзакцій не є безкоштовним. І часто, база даних є найбільш складною частиною вашої архітектури для масштабування. Можливо, ви вже перевіряєте логіку свого додатка, і, швидше, не вимагатимете другого хіта на продуктивність.
  • Відсутність потреби. Можливо, ваші дані брудні, і ви з цим все гаразд. Це дуже залежить від того, що ти робиш.

Дивіться також Що не так із іноземними ключами?


Але вони не відповідають причинам вашого питання.

Це бізнес-логіка, і її слід застосовувати всередині бізнес-рівня.

Ця причина трохи дивна. Унікальність та інші обмеження цілісності є значною мірою доменною базою даних ACID. Ваш код програми не може відповідати гарантіям атомності та цілісності SQLServer. Якщо вам потрібна чітка цілісність даних, вам буде нерозумно ігнорувати базу даних.

Другий аргумент полягає в тому, що вони хочуть застосувати підхід NoSQL до свого зберігання даних, тому вони не хочуть застосовувати такі обмеження.

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


Можливо, ваш системний архітектор має на увазі ці законні причини, і ви неправильно почули. А може, він дурний ідіот.

У будь-якому випадку є поважні (хоча і не універсальні) причини утримуватися від використання унікальності та зовнішніх ключових обмежень.

PS Якщо ви робите висновок, що не хочете сторонніх ключів, все одно добре використовувати реляційну базу даних. Як узагальнення, реляційні бази даних є більш зрілими, ніж їх аналоги NoSQL. Як єдиний вузол вони можуть бути навіть швидшими , а поверх них може бути побудована абстракція NoSQL .


12
Смію сказати, що Джоел не ідіот, але дотепна відповідь у подкасті, без жодних пояснень, IMHO, вартує навіть менше, ніж заява будь-якого ідіотця.
Мартін Ба

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

3
Фактична цитата Джоеля - це такі технології, як LINQ, які дають підстави заважати налаштувати зовнішній ключ. Джоель не адміністратор бази даних, і, шукаючи його блог і будучи давнім читачем, я не можу знайти нічого, щоб він розмовляв на цю тему або намагався дати пораду щодо оптимізації баз даних, розробки моделей даних тощо. , але його зараз немає, ні він ніколи не був - або претендував на це! - експерт у галузі баз даних або моделювання даних. Це як цитувати Ейнштейна про складний інтерес - або, з цього приводу, про бутерброди. (Довідка XKCD, ласкаво просимо.) :)
BrianH

4
Жоель Спольський відомий тим, що має тверду, суперечливу думку. Дивіться, що FogBugz написаний власною мовою ; Ін'єкція залежностей занадто складна (btw, це була найбільш суперечлива відповідь на Stackoverflow перед закриттям) ; Бази даних XML повільні ; пр.
BlueRaja - Danny Pflughoeft

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