Як я можу переконливо стверджувати проти дублювання стовпців бази даних?


47

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

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

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


2
Що означає "не зручно писати приєднується"? Як вони пояснюють це?
сценарій

9
Ці люди працюють на вас? Ви їх керівник? Більшість ваших виправдань можна знайти тут: en.wikipedia.org/wiki/Database_normalization . Так, їм потрібно покращити використання з'єднань.
Роберт Харві

1
Ви шукали літературу про те, чому нормалізація бажана?
Натан Туггі

17
Чи не додавати перегляди, які роблять з'єднання внутрішньо, роблять запити запису так само просто? Ви можете запропонувати їх як альтернативу.
CodesInChaos

1
Ви спілкувалися з цим (ввічливо) з однолітками та старшими? Які їх виправдання, які міркування вони роблять? Існує багато можливих причин, чому це може бути хорошою ідеєю (навіть якщо ви говорите: «продуктивність - це не причина», які докази ви повинні це підтвердити?). Перш ніж звинувачувати їх у занадто ледачих та / або жорстких, чи розглядали ви (і запитували) їх причини в тому, як вони мають такий дизайн? Може бути, набагато більше читається, ніж пише (аналітика важких БД)? Змінити відстеження? Історичні дані? Запитайте всіх - хтось може знати справжню причину.
Луань

Відповіді:


128

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

Ваша аналітична база даних (склад) повинна бути сильно денормалізованою, щоб полегшити аналіз.

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

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

Agile Design Warehouse Design - це хороша книга

Дивіться мої швидкі н брудних сховищ даних рад тут


9
Це правильний шлях.
Ніт

6
+1 Саме для цього призначені перегляди: надання можливості денормалізованого перегляду на нормалізованій базі даних.
Nzall

4
Абсолютно правильно, але я думаю, що "зменшити аномалії" слід наголосити більше, оскільки це головна відповідь на питання. Найбільш поширений (тільки?) Аномалію ви побачите з дублюванням даних / денормалізації є те , що стовпчики будуть яке - то чином отримати заселені з суперечливими даними , в той же час, залишаючи вас без можливості дізнатися , що реальні дані повинні бути і немає спосіб визначення того, що пішло не так. Останнє можна пом'якшити за допомогою масового відстеження змін, але це не буде дешевим або швидким, щоб пройти та знайти проблему. Більш економічно, щоб уникнути проблеми повністю.
jpmc26

2
Ще один аспект, який слід врахувати, полягає в тому, що, навіть якщо припустити, що розробники здатні підтримувати дані правильними (сумнівними), це стає величезним витратою на їхні ресурси, щоб забезпечити оновлення кожного дубліката поля, коли потрібно для збереження узгодженості.
Nate CK

1
@Panzercrisis Єдиний спосіб "неявної" транзакції - це якщо в кінці запиту у вас працює автоматична фіксація. Зазвичай це не стосується виробничої бази даних. У додатку транзакції слід ініціювати автоматично, а комісію слід видавати окремо від запиту. Це невелика передова інвестиція у додаток, але вона спрощує зміни коду, які передбачають додавання викликів до бази даних та зменшує, скільки розробник повинен думати (покращує швидкість розробки, зменшує помилки розробників). Такий дизайн також добре поєднується з такими речами, як об'єднання з'єднань.
jpmc26

57

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

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

Так ви поєднуєте перевагу нормалізації з зручністю простого вибору.


12
Погляди - ваші друзі. Використовуйте їх вільно. А для продуктивності ви навіть можете використовувати Матеріалізовані представлення, якщо ваш RDBMS підтримує їх.
VH-NZZ

13

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

Відповідь "Через закон Мерфі". Закон Мерфі говорить, що:

Якщо щось може піти не так, воно буде.

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

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


12

Думати про це з точки зору компромісів, а не добре / погано, буде більш продуктивним. Вони продають переваги нормалізації (особливо консистенції) за переваги в застосуванні запитів.

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

Що ви можете зробити, щоб зменшити ризики та витрати?

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

6

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

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


6
Його люди будуть стверджувати, що вони досить хороші, щоб переконатися, що всі дані оновлюються належним чином (при цьому я заперечую, якщо їм незручно приєднуватися). Можливо, кращим аргументом є те, що ви втрачаєте більшість переваг кислоти, яку надає RDBMS, якщо ухиляєтесь від нормалізації.
Роберт Харві

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

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

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

0

Щоб додати те, що запропонували інші хлопці вище. Це питання управління даними. Вам потрібно співпрацювати з відповідними зацікавленими сторонами: архітекторами даних та управителями даних, щоб розробити принципи даних, політику та конвенції про іменування.

Будьте терплячі та працюйте методично. Зміни не відбудуться протягом ночі.


0

Вийдіть.

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

Або ви можете просто заощадити час, розчарування та кинути зараз.

Хороші програмісти - дуже ліниві люди. Вони розуміють потреби клієнтів та менеджменту. Але найголовніше, що вони розуміють, що добре вирішувати проблеми, використовуючи добре розроблені та добре реалізовані рішення, економить їх особисто ВЕЛИЧЕЗНИЙ обсяг роботи, зусиль, а головне - агонії та стресу.

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

Щасти.


Поміркування: Можливо, потрібні інструменти BI / OLAP ... http://en.wikipedia.org/wiki/Online_analytical_processing

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