Переглядаючи моделі баз даних для RDBMS, я зазвичай здивований, виявляючи мало-ніяких обмежень (окрім PK / FK). Наприклад, відсоток часто зберігається у стовпчику типу int
(хоча це tinyint
було б більш доцільно), і немає CHECK
обмежень обмежувати значення діапазоном 0..100. Аналогічно на SE.SE, у відповідях, що пропонують перевірити обмеження, часто надходять коментарі, які свідчать про те, що база даних є неправильним місцем для обмежень.
Коли я запитую про рішення не застосовувати обмеження, члени команди відповідають:
Або що вони навіть не знають, що такі функції існують у їх улюбленій базі даних. Це зрозуміло лише для програмістів, які використовують ORM, але набагато менше від DBA, які стверджують, що мають 5+ років досвіду роботи з даними RDBMS.
Або те, що вони застосовують такі обмеження на рівні додатків, а дублювання цих правил у базі даних не є гарною ідеєю, порушуючи SSOT.
Останнім часом я бачу все більше проектів, де навіть іноземні ключі не використовуються. Так само я бачив тут кілька коментарів на SE.SE, які показують, що користувачі не надто дбають про референтну цілісність, дозволяючи програмі обробляти це.
Запитуючи команди про вибір не використовувати ФК, вони відповідають:
Наприклад, PITA, коли потрібно видалити елемент, на який посилаються в інших таблицях.
NoSQL гойдається, і сторонніх ключів там немає. Тому вони нам не потрібні в RDBMS.
Це не велика справа з точки зору продуктивності (контекст, як правило, це невеликі веб-додатки інтрамережі, що працюють на малих наборах даних, тому, навіть, навіть індекси не мали б великого значення; нікому не буде байдуже, чи ефективність даного запиту переходить за 1,5 с до 20 мс.)
Переглядаючи саму програму, я систематично помічаю два зразки:
Додаток належним чином дезінфікує дані та перевіряє їх, перш ніж надсилати їх у базу даних. Наприклад, немає можливості зберігати значення
102
у відсотках через додаток.Додаток передбачає, що всі дані, що надходять із бази даних, є абсолютно дійсними. Тобто, якщо він
102
надходить у відсотках, або щось, десь вийде з ладу, або він просто відображатиметься так, як є для користувача, що призводить до дивних ситуацій.Хоча більше 99% запитів виконуються однією програмою, з часом починають з'являтися сценарії - або сценарії, які виконуються вручну при необхідності, або завдання Cron. Деякі операції з даними також виконуються вручну над самою базою даних. І сценарії, і ручні запити SQL мають високий ризик введення недійсних значень.
І ось тут виникає моє запитання:
Які причини моделювання реляційних баз даних без обмежень перевірки і, зрештою, навіть без сторонніх ключів?
Оскільки це варте, це запитання та відповіді, які я отримав (особливо цікаве обговорення з Томасом Кіліаном), змусили мене написати статтю зі своїми висновками з приводу обмежень бази даних .