Чому багато конструкцій ігнорують нормалізацію в RDBMS?


23

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

У багатьох випадках ці конструкції включали більше 30 стовпців, і головний підхід полягав у тому, щоб "поставити все на одне місце"

Згідно з тим, що я пам’ятаю, нормалізація - одна з перших, найважливіших речей, то чому її іноді так легко випадати?

Редагувати:

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


7
тому що нормалізовані БД потребують великої кількості приєднань навіть до найтривіальніших запитів
храповиків-виродків

1
ці приєднання все одно повинні відбуватися навіть приховані поглядами
храповик виродка

29
Багато програмістів не знають основ реляційної моделі.
mike30

10
"Нормалізуйте, поки не болить, денормалізуйте, поки це не працює". codinghorror.com/blog/2008/07/… має кілька хороших відповідей.
Метью Степлз

3
Вони ігнорують це, оскільки їм не доводиться відповідати DBA, BI-аналітикам чи аудиторам безпеки.
Aaronaught

Відповіді:


19

Що цікаво в цій темі запитань і запитань, це те, що насправді є 3 питання. Усі відповіли на інший, і майже ніхто не відповів на перший:

  1. Чому НЕ деякі бази даних в дикій природі нормалізувалися?
  2. Чому / коли слід денормалізувати нормалізовану базу даних ?
  3. У яких ситуаціях шкідливо чи непотрібно в першу чергу нормалізуватися?

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

Крім того, у цій відповіді я припускаю, що "нормалізація" передбачає "BCNF, 3NF або, принаймні, 2NF" , оскільки саме такий рівень нормалізації прагнення досягти дизайнерам. Рідше бачити конструкції 4NF або 5NF; хоча вони, безумовно, не є неможливими цілями, вони стосуються семантики відносин, а не просто їх представлення , що вимагає значно більше знань про область.

Отже, вперед і вгору:

1. Чому деякі бази даних у дикій природі не нормалізуються?

Відповідь на це могла б бути "тому, що їх не повинно бути", але зробити це припущення відразу ж у кар'єра - досить бідна детективна робота. Ми не мали би великого прогресу як суспільство, якби завжди працювали з припущенням, що все, що повинно бути, повинно бути.

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

  • Розробники, які розробили це , не знали або не розуміли, як це нормалізувати. Справжні докази цього є у вигляді багатьох інших супутніх поганих варіантів дизайну, як, наприклад, використання колонок varchar для всього або наявність спагетті безглуздих назв таблиць і стовпців . І я запевняю вас, я бачив "справжні" бази даних, які є настільки ж поганими, як і статті у TDWTF.

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

  • Програмне забезпечення / було зроблено як проект Brownfield . Багато пуристів ігнорують цей ідеально законний бізнес, а не технічний причину не нормалізації. Іноді ви насправді не спрацьовуєте створити нову базу даних з нуля, вам доводиться переходити до існуючої застарілої схеми, а спроба її нормалізації в цей момент спричинить набагато біль. 3NF не був винайдений до 1971 року, і деякі системи - особливо фінансові / бухгалтерські - мають коріння ще далі, ніж це!

  • База даних була спочатку нормалізована , але накопичення невеликих змін протягом тривалого періоду часу та / або широко розповсюджена команда впроваджувала тонкі форми дублювання та інші порушення будь-якої нормальної форми. Іншими словами, втрата нормалізації була випадковою , і занадто мало часу було витрачено на рефакторинг.

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

2. Чому / коли слід денормалізувати нормалізовану базу даних?

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

  • Створіть індексовані подання, які інкапсулюють найпоширеніші проблемні області. Сучасні СУБД можуть зробити їх вставними або оновленими (наприклад, INSTEAD OFтригери SQL Server ). Це виходить з невеликими витратами на висловлювання DML в базових таблицях / індексах, але, як правило, це перший варіант, який слід спробувати, тому що майже неможливо викрутити і майже нічого не коштує підтримувати. Звичайно, не кожен запит може бути перетворений на індексований вигляд - сукупні запити є найскладнішими. Що призводить нас до наступного пункту ...

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

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

3. У яких ситуаціях шкідливе чи непотрібне в першу чергу нормалізуватися?

Насправді є кілька хороших прикладів тут:

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

  • При застосуванні нормованої моделі потрібен буде зайвий складний аналіз вхідних даних. Прикладом цього може бути система, якій потрібно зберігати телефонні номери, зібрані з декількох зовнішніх систем або бази даних. Ви можете денормалізувати код виклику та код області, але вам доведеться враховувати всі можливі формати, недійсні номери телефонів, суєтні номери (1-800-GET-STUFF), не кажучи вже про різні локалі. Зазвичай це більше клопоту, ніж коштує, і телефонні номери зазвичай просто заносять в одне поле, якщо у вас немає конкретної потреби бізнесу в коді району самостійно.

  • Коли реляційна база даних передусім є для забезпечення транзакційної підтримки для додаткової, нереляційної бази даних. Наприклад, ви можете використовувати реляційну базу даних в якості черги повідомлень або відстежувати стан транзакції або саги, коли основні дані зберігаються в Redis або MongoDB або будь-якому іншому. Іншими словами, дані - це "контрольні дані". Зазвичай немає сенсу нормалізувати дані, які насправді не є бізнес-даними .

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

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

І щоб відповісти на останнє запитання:

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

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

База даних 3NF або BCNF, як правило, є гарною відправною точкою для аналізу, оскільки вона була випробувана і зарекомендувала себе успішною в десятках тисяч проектів по всьому світу, але знову ж таки, так це і C. Це не означає, що ми автоматично використовуємо C у кожному новий проект. Ситуації в реальному світі можуть вимагати деяких модифікацій моделі або взагалі використання іншої моделі. Ви не знаєте, поки не опинитесь у цій ситуації.


1
Ви повинні скопіювати та вставити це в статтю блогу ... це ЗОЛОТЕ.
Марсель Попеску

15

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

Нормалізація дає кілька основних переваг:

  1. Мінімізує кількість зайвих даних.
  2. Максимізує ступінь, в якому база даних вбудована в механізми цілісності (зовнішні ключові обмеження, унікальні обмеження) можна використовувати для забезпечення цілісності даних.
  3. Зменшує кількість стовпців на рядок, збільшуючи ефективність вводу-виводу в деяких випадках. Широкі ряди потребують більше часу.

Однак, існує чимало вагомих причин денормалізації:

  1. Продуктивність, особливо для аналітики, може бути калічена нормалізацією. Для аналізу відносно реляційних баз даних стандартним є підхід до денормалізованих розмірних моделей .
  2. Користь від забезпечення цілісності даних всередині бази даних починає зменшуватися. Оскільки все більше і більше розробок зосереджується на об'єктно-орієнтованому середньому рівні, який часто виконує правила ведення бізнесу, посилання на реляційні обмеження в базі даних є менш важливою.
  3. Як зазначали інші, нормалізація ускладнить запити, необхідні для отримання відповідних даних.

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

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


7
Привіт Йосі, я розумію вашу думку. Нормалізація є основоположним в реальному розумінні теорії реляційних баз даних і має реальне застосування на практиці, тому не дивно, що це велика тема на курсах. Хороші інженери повинні це розуміти і розуміти, коли це слід застосовувати. Те, що, здається, не висвітлюється в курсовій роботі, - це те, що вибірково денормалізація може принести багато користі, а деякі проблеми справді не піддаються нормалізованим моделям.
DemetriKots

1
А як щодо узгодженості даних? Наприклад, якщо ви маєте найменування магазину в кожній деталі продажів, то потенційно ви можете мати різні суперечливі описи, тоді як якщо дані нормалізуються, назва магазину з’являється лише одна (у таблиці магазину) і немає місця для невідповідності.
Тулен Кордова

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

1
З іншого боку, аналітика є шалено важкою, якщо ви не можете почати з нормалізованої моделі. Мені просто довелося пройти цю вправу, і це було пекло. Розробники програм ніколи не повинні вважати, що денормалізована схема буде придатною для потреб в аналітиці. А щодо пункту №3 проти нормалізації - це проблема, яка майже тривіально вирішується матеріалізованими / індексованими поглядами.
Aaronaught

1
І # 2 звучить розумно, але напружує довірливість на практиці - я не можу згадати, як бачив жодний екземпляр за мої 10+ років, де обмеження фактично ретельно виконувались додатком. Частіше розробники або неправильно прирівнюють бізнес-правила до цілісності даних, або використовують той факт, що ORM теоретично можуть застосовувати реляційні обмеження як привід взагалі цього не робити. Можливо, я просто цинічний, але весь мій кар’єрний досвід навчив мене, що твердження на кшталт "додаток забезпечить цілісність даних" - це величезні червоні прапори.
Aaronaught

11
  1. Дуже багато розробників не знають і не дбають ні про нормалізацію, ні про моделювання даних чи базу даних.
  2. Для деяких робочих місць це дійсно не важливо.
  3. Іноді є дійсно вагомі причини знецінити норму, наприклад, зробити так, щоб певне складне навантаження добре працювало.
  4. Концепції реляційних баз даних останнім часом менше в моді, ніж в 1990-х та 2000-х роках. На розробників, як правило, впливає мода, навіть якщо вони претендують на дуже раціональний характер. Про смак сперечатися немає сенсу.

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


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

1
Що стосується пункту №4, я б сказав, що реляційні бази даних менше в моді і починають замінюватись на сорти nosql, і це насправді велика річ багато часу. Але я не бачу багато рушіїв та шейкерів, що збирають разом нереляційні моделі даних за допомогою RDBMS. Це просто нерозумно.
Aaronaught

@joshp - Дякую, приємне резюме. бал №3 - це той, кого мене особисто більше цікавить. Чому інші фактори «перемагають» необхідність нормалізації.
Йосі Дахарі

@JimmyShelter Я згоден. Мода вбік, реляційна - це не завжди найкращий вибір.
joshp

4
@Yosi - Причина, чому деякі фактори можуть козирити нормалізацію, полягає в тому, що нормалізація - це методика уникнення поширених проблем узгодженості даних під час введення, оновлення та видалення даних. Якщо дані записуються один раз, а потім читаються лише після цього, значення C, U та D CRUD вже не мають значення. У такому випадку переваги нормалізації в основному є безглуздими, тому інші конкуруючі тиски можуть мати перевагу, такі як ефективність читання або простота запитів.
Джоель Браун

9

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

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

Ще одним фактором поганого дизайну баз даних є той факт, що нормалізація не є тривіальною темою, особливо якщо мова йде про 4-й НФ, 5-й НФ тощо. Більшість книг, які я бачив, не могли чітко пояснити ці форми. Зазвичай є погані приклади і занадто багато теорії. Це робить тему менш популярною, ніж повинна.

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

Додайте до цього той факт, що деякі проекти не дотримуються суворої методології розробки (та, яка сприяє проектуванню баз даних), в результаті відповідальність змішується і завдання втрачаються між бізнес-аналітиком, розробниками та DBA. Розробники розмовляють в OO та UML, де DBA говорять в DD, а деякі в ERD і, ймовірно, багато хто не отримують UML або OO. Коротше кажучи, у цьому винна відсутність знань, відсутність хороших чітких ресурсів, відсутність єдиної мови для опису даних та відсутність методології.


Чи можете ви запропонувати якість дизайну баз даних (не тільки схеми, але і процедур) документів / статей?
Тилак

"наявність багатьох стовпців в одній таблиці не суперечить нормалізації" -Упевнений, моїм наміром було #entailments. У запитанні, яке я згадав у # стовпчиках просто для простоти, моє припущення було, що читач зрозуміє кореляцію і тим, що я мав на увазі
Йосі Дахарі

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