Що таке нормалізація (або нормалізація)?


104

Чому хлопці з бази даних продовжують нормалізацію?

Що це? Як це допомагає?

Чи застосовується це до чого-небудь поза базами даних?

Відповіді:


171

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

Існує ряд рівнів нормалізації від 1. нормальної форми до 5. нормальної форми. Кожна нормальна форма описує, як позбутися якоїсь конкретної проблеми, зазвичай пов’язаної із надмірністю.

Деякі типові помилки нормалізації:

(1) Маючи в комірці більше одного значення. Приклад:

UserId | Car
---------------------
1      | Toyota
2      | Ford,Cadillac

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

UserId | Car
---------------------
1      | Toyota
2      | Ford
2      | Cadillac

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

(2) Маючи зайві не ключові дані (тобто дані повторюються без необхідності в кілька рядків). Приклад:

UserId | UserName | Car
-----------------------
1      | John     | Toyota
2      | Sue      | Ford
2      | Sue      | Cadillac

Ця конструкція є проблемою, оскільки ім'я повторюється для кожного стовпця, навіть якщо ім'я завжди визначається UserId. Це теоретично дає можливість змінити ім’я Сью в один ряд, а не в інший, що є корупцією даних. Проблема вирішується розділенням таблиці на дві частини та створенням зв’язку первинний ключ / зовнішній ключ:

UserId(FK) | Car               UserId(PK) | UserName
---------------------          -----------------
1          | Toyota            1          | John
2          | Ford              2          | Sue
2          | Cadillac

Тепер може здатися, що у нас все ще є зайві дані, оскільки UserId повторюються; Однак обмеження PK / FK гарантує, що значення не можна оновити самостійно, тому цілісність є безпечною.

Це важливо? Так, це дуже важливо. Маючи базу даних з помилками нормалізації, ви відкриваєте ризик потрапляння недійсних або пошкоджених даних у базу даних. Оскільки дані "живуть вічно", дуже важко позбутися пошкоджених даних, коли вони вперше увійшли до бази даних.

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

Існує ряд помилок щодо нормалізації:

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

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

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


4
Приклад, який ви дали для першого нормального, не зовсім коректний. Я завжди пам’ятаю перші три нормальні форми термінами, що повторюються, надлишкові, не залежні. Повторні дані стосуються того, коли розробники баз даних починають писати дефіші таблиці, які містять стовпці, як DogName1, DogName2, DogName3, тощо.
Білл

2
@Bill: Чому ви вважаєте, що приклад, який я надаю, невірний? Чи знаєте ви визначення 1NF, де приклад був би нормальним?
ЖакБ

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

@Lealo Ні, зовсім не. Ви завжди можете зіставити стан проекту OO тривіально у "реляційній" базі даних / дизайні за допомогою таблиць - ось що таке ORM - але база даних / дизайн, яку ви отримуєте, є реляційною репрезентацією проекту OO, а не реляційним поданням бізнес , а не тільки реляционное уявлення дизайну OO явно при умови поновлення аномалій і надмірність , що нормалізація управляє , але методи OO повинні забезпечити дотримання відповідного (незареєстровану) (комплексне) обмеження ( «уявлення інваріантним») вручну.
філіпсі

@Lealo: Принцип дійсно застосовується до OOP в тій мірі, коли ви ніколи не повинні мати однакову інформацію (у змінній формі) про два різні об'єкти, оскільки вони можуть вийти із синхронізації.
ЖакБ

45

Правила нормалізації (джерело: невідомо)

  • Ключ ( 1NF )
  • Весь ключ ( 2NF )
  • і нічого, крім ключа ( 3NF )

... Тож допоможи мені Кодд.


12
Я думаю, що це трохи розпливчасто без належного контексту, чи не так?
Рік

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

1
wikipedia пояснює це тут - "Необхідність існування" ключа "гарантує, що таблиця знаходиться в 1NF; вимога, щоб атрибути, що не належать до клавіш, залежали від" цілого ключа ", забезпечували 2NF; додатково вимагаючи, щоб атрибути, що не є ключовими, не залежали від" нічого але ключ "забезпечує 3NF".
Kcats Wolfrevo

Згідно з Вікіпедією, джерелом є Білл Кент: "[Кожен] неклавішний [атрибут] повинен містити інформацію про ключ, весь ключ і нічого, крім ключа".
аптерикс

19

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

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

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

PS також ознайомтеся з цією статтею: http://en.wikipedia.org/wiki/Database_normalization, щоб дізнатися більше про тему та про так звані нормальні форми


Ви також були б дуже здивовані тим, наскільки насправді потрібна денормалізація в транзакційних програмах. В одному монстр-застосунку, для якого я робив модель даних, схема з 560 таблиць мала лише 4 елементи денормалізованих даних.
ЗанепокоєнняOfTunbridgeWells

Це запобігає "аномалії оновлення". Це робиться шляхом усунення певних видів дублювання.
S.Lott

"Моя порада - почати з хорошого ступеня нормалізації і робити денормалізацію лише тоді, коли це дійсно потрібно". Ця порада дуже погана! Я досі не бачив належної ілюстрації цієї "псевдо-теорії". Мінус 1.
Філіп Гронд'є

7

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

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

Надмірність та залежність даних небажана, оскільки це може призвести до невідповідностей при зміні даних.


5

Він призначений для зменшення надмірності даних.

Для більш формального обговорення, см Вікіпедії http://en.wikipedia.org/wiki/Database_normalization

Наведу дещо спрощений приклад.

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

id, name, address
214 Mr. Chris  123 Main St.
317 Mrs. Chris 123 Main St.

можна нормалізувати як

id name familyID
214 Mr. Chris 27
317 Mrs. Chris 27

і сімейний стіл

ID, address
27 123 Main St.

Практично нормальна нормалізація (BCNF) зазвичай не використовується у виробництві, але є проміжним етапом. Після того, як ви розмістили базу даних в НФКАХ, наступний крок, як правило , в Де-нормалізує його в логічному порядку , щоб прискорити виконання запитів і зменшити складність деяких загальних вставок. Однак, ви не можете зробити це добре, якщо спочатку не нормалізувати його.

Ідея полягає в тому, що надмірна інформація зводиться до одного запису. Це особливо корисно в таких областях, як адреси, де містер Кріс подає свою адресу як Unit-7 123 Main St., а місіс Кріс перераховує Suite-7 123 Main Street, яка відображатиметься в оригінальній таблиці як дві різні адреси.

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


1
BCNF не є "ідеальним". Існують вищі нормальні форми, до 6NF, де всі ваші таблиці - це лише ключ і значення даних. Це рідко коли-небудь використовується, хоча
Рик

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

3

Цитуючи дату CJ: Теорія є практичною.

Відхилення від нормалізації призведе до певних аномалій у вашій базі даних.

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

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

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

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

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

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

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


2

Нормалізація - одне з основних понять. Це означає, що дві речі не впливають одна на одну.

У базах даних конкретно означає, що дві (або більше) таблиці не містять однакових даних, тобто не мають надмірності.

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

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


2

Що таке нормалізація?

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

Нормалізація Процес Надано
введіть тут опис зображення

Спочатку нормальна форма тоді і тільки тоді, коли домен кожного атрибута містить лише атомні значення (атомне значення - це значення, яке неможливо розділити), а значення кожного атрибута містить лише одне значення з цього домену (наприклад: - домен для гендерний стовпчик: "М", "Ж".).

Перша нормальна форма виконує ці критерії:

  • Виключіть повторювані групи в окремих таблицях.
  • Створіть окрему таблицю для кожного набору пов’язаних даних.
  • Визначте кожен набір пов’язаних даних за допомогою первинного ключа

Друга нормальна форма = 1NF + відсутність часткових залежностей, тобто всі неклавішні атрибути повністю функціонально залежать від первинного ключа.

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

Нормальна форма Бойса - Кодда (або BCNF або 3,5NF) - дещо сильніша версія третьої нормальної форми (3NF).

Примітка: - Друга, третя та нормальні форми Бойса – Кодда пов'язані з функціональними залежностями. Приклади

Четверта нормальна форма = 3NF + видалити багатозначні залежності

П'ята нормальна форма = 4NF + усунення приєднаних залежностей


0

Як говорить Мартін Клеппман у своїй книзі "Проектування інтенсивних додатків":

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


-10

Це допомагає запобігти повторенню (і ще гірше конфліктних) даних.

Хоча це може мати негативний вплив на продуктивність.


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

1
сучасні двигуни баз даних використовують кешування, що часто робить нормалізовані бази даних більш ефективними, ніж ненормовані. якщо сумніваєтесь, міряйте.
Стівен А. Лоу

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

@Bill, мені доведеться дещо не погодитися. Єдиний спосіб, коли повністю нормалізована база даних допомагає виконувати продуктивність, - це заважає системі не стикатися із зайвими даними. Крім цього, це є найгіршим випадком з точки зору ефективності.
Брайан Ноблеуч

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