Чи слід визначати співвідношення між таблицями в базі даних або просто в коді?


60

На мій досвід, багато проектів, про які я читав у минулому, не мали визначення баз даних у базі даних, натомість вони визначали їх лише у вихідному коді. Тож мені цікаво, які переваги / недоліки визначають співвідношення між таблицями в базі даних та вихідним кодом? І більш широке питання стосується інших вдосконалених функцій сучасних баз даних, таких як каскад, тригери, процедури ... У моїх думках є деякі моменти:

У базі даних:

  • Правильні дані з дизайну. Попередити помилки програми, які можуть спричинити недійсні дані.

  • Скорочуйте зворотну поїздку в мережу до програми під час вставки / оновлення даних, оскільки програма повинна зробити більше запитів, щоб перевірити цілісність даних.

У вихідному коді:

  • Більш гнучка.

  • Краще під час масштабування до декількох баз даних, так як іноді це відношення може бути міжбазовим.

  • Більше контролю над цілісністю даних. База даних не повинна перевіряти кожен раз, коли програма змінює дані (складність може бути O (n) або O (n log n) (?)). Натомість делегується додатку. І я думаю, що обробка цілісності даних у додатку призведе до більш детальних повідомлень про помилки, ніж використання бази даних. Наприклад, коли ви створюєте сервер API, якщо ви визначаєте відносини в базі даних, а щось піде не так (як, наприклад, посилання, яке не використовується), ви отримаєте виняток SQL з повідомленням. Найпростішим способом буде повернути клієнту 500, що існує "внутрішня помилка сервера", і клієнт не матиме уявлення про те, що йде не так. Або сервер може проаналізувати повідомлення, щоб зрозуміти, що не так, що на мою думку - це некрасивий спосіб, схильний до помилок. Якщо ви дозволите програмі це впоратися,

Є ще щось?

Редагувати: як вказує Кіліан, мій погляд на ефективність та цілісність даних дуже помилковий. Тому я змінив, щоб виправити свою думку там. Я цілком розумію, що дозволити базі даних обробляти це буде більш ефективним та надійним підходом. Будь ласка, перевірте оновлене запитання та дайте кілька питань щодо нього.

Редагувати: дякую всім Усі відповіді, які я отримав, вказують, що обмеження / відносини слід визначати в базі даних. :). У мене є ще одне запитання, оскільки це зовсім поза сферою цього питання, я щойно опублікував це як окреме питання: Обробляти помилку бази даних для сервера API . Будь ласка, залиште трохи інформації.


4
"оскільки програма повинна робити більше запитів, щоб перевірити цілісність даних." Не обов'язково. Якщо база даних повністю контролюється вашою програмою, додаткова перевірка цілісності даних може бути надмірно захисним програмуванням. Вам не обов'язково потрібні вони; просто перевірити свою програму належним чином, щоб переконатися, що вона вносить лише дійсні зміни в базу даних.

9
Є одне, про що ніколи не слід забувати: Якщо всі учасники не пишуть ідеальне програмне забезпечення, якщо перевірки є в програмному забезпеченні, одна з цих перевірок буде невдалою і призведе до того, що обмеження не виконуються. Справа не в тому, якщо, а коли. Це призводить до важких відтворень помилок і довгих годин масажування даних, щоб знову відповідати обмеженням програмного забезпечення.
Дабу

10
Щось варто згадати ... щойно ви вводите проблеми з цілісністю у свою базу даних, це відкриття вікна Пандори. Кошмар - це повернення цілісності до бази даних про аномалію. Дотримання чіткого контролю над вашою базою даних може бути клопотом, але це позбавить від вас багато болю в довгостроковій перспективі.
DanK

3
У вихідному коді: Ви зрештою пишете більшу частину бази даних.
Blrfl

7
Я одного разу запитав дуже талановитого програміста подібне запитання, він сказав мені: "Це як гальмо на автомобілі. Справа не в тому, щоб машина їхала повільніше, а в тому, щоб їхати швидше безпечніше". Впевнений, що можна запускатись без обмежень, але якщо погані дані якимось чином потрапляють, це може спричинити серйозну аварію
mercurial

Відповіді:


70

TL; DR: Обмеження відносин повинні знаходитися в базі даних.


Ваша заявка недостатньо велика.

Ви дійсно правильні, що примусові відносини в базі даних можуть зажадати їх застосування у програмі.

Однак я зазначу, що спочатку слід перевірити документацію програмного забезпечення, яке ви використовуєте, та перевірити існуючі пропозиції товарів. Наприклад, є пропозиції кластеризації поверх Postgres та MySQL.

І навіть якщо вам потрібно мати певну перевірку в додатку, не кидайте дитину разом з водою з ванни . Зрештою, чим менше треба робити, тим краще тобі.

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

Ваша заявка недостатньо правильна.

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

І кого ви змінюєте найчастіше?

Я б зробив ставку на правильність бази даних у будь-який час .

Ваші розробники роздумують недостатньо.

Зменшіть мережеву зворотну поїздку до програми, коли вставляти / оновлювати дані, оскільки програма повинна робити більше запитів, щоб перевірити цілісність даних.

Червоний прапор ! 1

Якщо ви думаєте:

  • перевірити, чи існує запис
  • якщо ні, вставте запис

то ви провалили найпростішу проблему одночасності: інший процес / нитка може додавати запис під час проходження.

Якщо ви думаєте:

  • перевірити, чи існує запис
  • якщо ні, вставте запис
  • перевірте, чи запис було вставлено як дублікат

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

Підтримання обмежень на декількох сесіях - це справді важка проблема, радий, що це вирішено у вашій базі даних.

1 Якщо ваша база даних належним чином не реалізує властивість Serializable; але мало хто насправді це робить.


Останнє:

І я думаю, обробка цілісності даних у застосуванні дозволить отримати більш багатослівне повідомлення про помилку, ніж використання бази даних. Наприклад, коли ви створюєте сервер API. Якщо ви визначите відносини в базі даних, і щось піде не так (як-от посилання, що посилається, не існує), ви отримаєте виняток SQL з повідомленням.

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

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

Крім того, і будьмо чесними тут, більшість випадків ви все одно не будете обробляти помилки, які витончено. Просто тому, що їх так багато, і ви не будете рахувати за них усіх ...

... що просто прив'язується до точки правильності вище. Щоразу, коли ви бачите "500: внутрішня помилка сервера", оскільки обмеження бази даних спрацьовувало і не оброблялося, це означає, що база даних зберегла вас, оскільки ви просто забули обробляти її в коді.


3
Ха-ха, ти це написав, коли я писав свій коментар, іронічно наголошуючи на тому, що ми обидва робимо. Я повністю погоджуюся: Ви навіть не можете робити цілісність або обмеження в коді, який не є БД. Операції не бачать результатів інших, поки вони не здійснені (і навіть тоді, можливо, ні). Ви можете отримати ілюзію цілісності, але це може спричинити за часом або серйозними проблемами масштабованості через блокування. Тільки база даних може це зробити правильно.
LoztInSpace

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

1
@ Kat11: Це правда. А самоописування також має перевагу в тому, що інструменти можуть легко зрозуміти дані та діяти на них, що може бути корисним іноді.
Матьє М.

1
Ваш аргумент щодо MVCC не є точним у БД, які правильно реалізують ізоляцію SERIALIZABLE (наприклад, сучасні версії PostgreSQL - хоча багато основних RDBMS не мають). У такій БД навіть перший, наївний підхід спрацював би правильно - якщо записувати конфлікт, вони будуть відкинуті назад як збій серіалізації.
James_pic

1
У БД, які правильно реалізують СЕРІАЛІЗАБІЛЬНІ, якщо ви здійснили всі успішно здійснені транзакції, є певне впорядкування (яке може бути не таким, як впорядкування настінних годин), таке, якби ви виконували їх усі послідовно (без жодної сукупності) у такому порядку всі результати були б абсолютно однаковими. Це складно правильно, і специфікації SQL є досить розпливчастими, що ви можете переконати себе, що це нормально, щоб дозволити перекос письма на рівні СЕРІАЛІЗАЦІЙНОГО, тому багато постачальників БД трактують СЕРІАЛІЗАЦІЙНО як ІЗОЛЯЦІЮ СНАПШОТУ (я дивлюся на вас Oracle).
James_pic

119

Базі даних не потрібно перевіряти цілісність даних щоразу, коли додаток змінює дані.

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


5
@ dan1111 Я не розумію ваш коментар ... Ви кажете: прості обмеження застосовуються базою даних, тому вони не є проблемою для коду програми, складніші обмеження занадто важкі для реалізації, тому просто відмовтеся від них? Або ви хочете сказати, що реалізація складних обмежень за допомогою тригерів бази даних (і подібного механізму) є занадто складною, і тому краще реалізувати їх у коді програми?
Бакуріу

47
Ви навіть не можете зробити цілісність або обмеження в коді, який не є БД. Операції не бачать результатів інших, поки вони не здійснені (і навіть тоді, можливо, ні). Ви можете отримати ілюзію цілісності, але це може спричинити за часом або серйозними проблемами масштабованості через блокування. Тільки база даних може це зробити правильно.
LoztInSpace

17
Анекдотично, щоб продовжити коментар @ LoztInSpace, я одного разу працював у (жахливій) компанії, де одна з цих таблиць була створена таким чином, що замість того, щоб давати автоматичному збільшенню ідентифікатора БД, програма взяла ідентифікатор останніх рядків, додав його до нього і використав це як новий ідентифікатор. На жаль, приблизно раз на тиждень було вставлено копії ідентифікаторів, що припиняють роботу програми.
Trotski94

9
@ dan1111 Ви ніколи не пишете помилок у програмі, правда?
користувач253751

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

51

Обмеження повинні лежати у вашій базі даних, оскільки (з найкращою волею у світі) ваш додаток не буде єдиним, що коли-небудь має доступ до цієї бази даних.

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

Крім того, ви можете отримати інші вимоги, наприклад, "Big customer X дійсно потребує цього листа Excel, імпортованого в нашу базу даних сьогодні в другій половині дня", де вам не припаде до розкоші адаптувати ваш код програми до відповідного випадку, коли брудний SQL-скрипт виконає це вчасно.

Тут цілісність рівня бази даних врятує ваш бекон.


Крім того, сформулюйте розробника, який приймає вашу роль у цій компанії після того, як ви виїдете, а потім покладіть на нього завдання внести зміни в базу даних.

Чи ненавидить він вас, якщо в базі даних немає обмежень ФК, щоб він міг сказати, які стосунки має таблиця, перш ніж змінити її? ( Підказка, відповідь - так )


33
О брате. Я не можу сказати, скільки разів мені доводилося пояснювати людям, що в базі даних є більше одного клієнта! Навіть якщо зараз є лише один клієнт і лише одна дорога для введення даних у систему, проектування вашої програми та схеми на основі цього припущення є найкращим способом для майбутнього Йосі ненавидіти минулого Йоші.
Грег Бургхардт

9
@nikonyrh Я б цього не робив. Існують обмеження, щоб додатки могли покладатися на послідовні дані. Відключити FK "просто, щоб увійти" - це безумство.
Падді

5
Домовились. Крім того, навіть якщо ваша програма є єдиним клієнтом, у вас можуть бути різні версії вашої програми, намагаючись застосувати трохи інші обмеження. Зазвичай виникає веселість (ну, не дуже. Це більше схоже на "хаос і повне розчарування", ніж на "веселість").
Ікер

5
Я абсолютно можу це засвідчити. У моєму випадку я застряг на MyISAM, який насправді не підтримує сторонні ключі, тому я отримав 250 ГБ даних з цілісністю, застосованою програмою. Коли почали обрізати дані, щоб отримати відставання до більш керованого розміру, і коли з’ясувалося, що сама програма взагалі не зможе це впоратися, настав хаос. Я не знаю, чому я використовую минулий час; це все ще відбувається зараз, і проблема (два роки далі) ще належить вирішити. * sniff *
Гонки легкості в орбіті

1
Я заперечую, що гідна база коду повинна полегшити написання одноразового сценарію, використовуючи стійкий шар з вашої програми принаймні так само швидко, як писати необроблений SQL. "Змінення коду програми" ніколи не повинно бути необхідним для разових сценаріїв.
Джонатан У ролях

17

Ви повинні мати відносини в базі даних.

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

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


1
Правда. Я повинен був сказати, що ефективність перевірки обмежень буде краще оброблятися в базі даних, ніж у додатку.
Кірк Бродхерст

13
  • Ми більше не живемо в одному задньому <-> одному передньому світі.
  • Більшість рішень стосуються веб-інтерфейсу, мобільного фронтального пристрою, пакетного фронтального пристрою та фронтального пристрою iPad тощо.
  • Двигуни бази даних вже мають тисячі випробуваних рядків коду, оптимізованих для забезпечення референтної цілісності.

Чи дійсно ви можете дозволити собі написання та тестування референційного коду, що підтверджує цілісність, коли у вас є код вирішення проблем домену?


2
"Ми більше не живемо в одному задньому <-> одному передньому світі". Ми коли-небудь? Кілька років тому я працював над системою баз даних, яка мала програми, написані щонайменше двома десятками різних мов, що мають доступ до неї. Деякі програми мали свій перший випуск у 1970-х.
Майк Шеррілл 'Згадка про котів'

2

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

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

В якості додаткового зауваження до цього, спроектуйте свою базу даних максимально нормалізованою та атомною. Ніяких «божих» таблиць. Витратьте багато зусиль на розробку вашої бази даних як можна простіше, в ідеалі з багатьма невеликими таблицями, які окремо дуже чітко визначені, з однозначною відповідальністю і ретельно перевірені у всіх стовпцях. База даних є останнім захисником вашої цілісності даних. Він являє собою утримання замку.


1

Більшість людей в основному говорять «так, в загальному ти будеш завжди визначати відносини в базі даних». Але якби дисципліни з інформатики були такими простими, нас називали б "Програмними читачами", а не "Інженерами програмного забезпечення". Я дійсно погоджуюся з тим, що обмеження повинні міститись у базі даних, якщо тільки немає вагомих причин вони не повинні , тому дозвольте лише навести пару причин, які можуть вважатися хорошими в певних ситуаціях:

Дублікат коду

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

Зусилля

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

Ефективність

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

Контроль

Дещо пов'язане з ефективністю. Іноді потрібен надзвичайно тонкий контроль над тим, як функція реалізована, а іноді, маючи обробку бази даних, вона ховає її за чорною скринькою, яку потрібно відкрити.

Точки закриття

  • Бази даних записуються в код. У них немає нічого магічного, що ви не можете зробити у власному коді.
  • Нічого не вільне. Обмеження, відносини тощо використовують усі цикли процесора.
  • Люди у світі NoSQL чудово уживаються без традиційних реляційних функцій. Наприклад, у MongoDB структура документів JSON є достатньою для підтримки всієї бази даних.
  • Сліпе і необізнане використання розширених функцій бази даних не може гарантувати жодних переваг. Ви можете випадково змусити щось зробити, лише щоб потім його зламати.
  • Ви задали дуже загальне запитання, не перераховуючи конкретні вимоги чи обмеження. Справжня відповідь на ваше запитання - це "залежить".
  • Ви не вказали, чи це проблема в масштабі підприємства. Інші відповіді говорять про такі речі, як клієнти та цілісність даних, але іноді ці речі не важливі.
  • Я припускаю, що ви говорите про традиційну реляційну базу даних SQL.
  • Моя точка зору полягає в тому, що я відмовився від використання тонни обмежень та сторонніх ключів у невеликих (до 50 таблиць) проектах, і не помітив будь-яких недоліків .

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


1
Якщо люди заперечують продумані відповіді, оскільки вони не згодні з їх догмою, SE StackExchange стає гіршим місцем.
Карл Лет

5
Припущення цієї відповіді, що бувають випадки, коли ви можете залишити обмеження поза БД, є дійсним, але пояснення є бідним та оманливим. Хоча я погоджуюся, що база даних не є найкращим місцем для деяких обмежень, жодна реляційна база даних не повинна проходити без основних ключових та референтних обмежень цілісності . Немає . З цього немає нульового винятку. Кожна база даних потребує первинних ключів, а переважній більшості знадобляться іноземні ключі. Вони завжди повинні застосовуватися до бази даних, навіть якщо це дублює логіку. Справа в тому, що ти замовчуєш через це, тому я спростував.
jpmc26

1
"Бази даних написані в коді. Нічого магічного вони не роблять, що ви не можете зробити у власному коді." ні, ви не можете застосувати референтну цілісність у коді програми (і якщо вам не потрібно його застосовувати, чому ви взагалі використовуєте сервер бази даних?). Справа не в тому, що код може робити, це в тому, де це можна зробити.
Гайд

0

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

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

Будь-який примірник, який працює над цим шаром стійкості, може покластися на нього. Я припускаю, що ви інкапсулюєте цей шар через інтерфейс (сервіс). Тож ось момент, коли дизайн закінчується і починається реальний світ.

Дивлячись на ваші моменти, особливо на крос-бази даних . У такому випадку, так, не повинно бути посилання, реалізоване в самому RDBMS, а в службі. Але перш ніж слідувати цим способом, чи не було б краще розглянути це вже під час проектування?

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

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

Проблема продуктивності через перевірку цілісності в БД не реальна. RDBMS може перевірити такі речі набагато швидше, ніж будь-яка реалізована вами реалізація. Чому? Ну, вам доведеться мати справу зі зривами засобів масової інформації, RDBMS не робить. І він може оптимізувати такі перевірки, використовуючи свою статистику aso

Отже, бачите, все повертається до дизайну. Звичайно, ви можете сказати зараз, але що робити, якщо з’явиться невідома вимога, зміна гри? Так, це може статися, але такі зміни повинні бути розроблені та сплановані як і раніше. ; o)


0

У вас є дуже хороші відповіді, але ще кілька моментів

Цілісність даних - це те, що створена база даних

Виконання належної одночасності, як видалення FK, на рівні програми було б жахливо

Експертиза цілісності даних проводиться за допомогою DBA

На програмному рівні ви вставляєте, оновлюєте, об'ємне оновлення, групове вставлення, групове видалення ...
Тонкий клієнт, товстий клієнт, мобільний клієнт ....
Цілісність даних - це не досвід роботи програміста - багато дублікату коду, і хтось зіпсує це вгору

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

Можливо, вам потрібно буде маніпулювати даними безпосередньо через SQL або TSQL
Ніхто не пам’ятатиме всі правила даних


0

Ваше питання не має сенсу: якщо ви можете змінити базу даних, це код, якщо ви не можете змінити базу даних, вам доведеться створити свої обмеження в іншому місці.

База даних, яку ви можете змінити, - це кожний біт, стільки ж коду, скільки будь-яка лінія ruby, javascript, c # або ada.

Питання про те, де поставити обмеження у вашій системі, має зводитися до надійності, вартості та простоти розробки.


0

Тут є багато хороших відповідей. Додам, що якщо у вас є додаток, написане мовою Y, ви можете створити код, схожий на обмеження бази даних у Y. І тоді хтось захоче отримати доступ до вашої бази даних мовою Z, вам доведеться знову написати той же код. Допоможе вам Бог, якщо реалізації не зовсім однакові. Або коли досвідчений бізнес-користувач підключається до вашої бази даних за допомогою Microsoft Access.

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

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.