Що повинен знати кожен розробник про бази даних? [зачинено]


206

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



Які важливі поняття, які розробники та інші фахівці з програмного забезпечення повинні знати про бази даних?


Правила відповідей:


Тримайте список недовго.
Одне поняття на відповідь найкраще.

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

Поясніть своє обґрунтування.
Чому ваша концепція важлива? Не кажіть просто "використовуйте індекси". Не впадайте в "кращі практики". Переконайте свою аудиторію дізнатися більше.

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

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


15
Навіщо голосувати, щоб закрити це ?? Це спільнота Wikia і тому підходить.
Девід

5
Я проголосую за повторне відкриття, якщо він закриється ... Я також хотів би побачити список тих речей, про які слід ознайомитись (але не знаю) про ОПР та програми / Системи програмного забезпечення системи ..
Чарльз Бретана

7
@gnovice: Слово "суб'єктивне" в цьому контексті стосується питань, які повністю є питанням думки. "Що ви думаєте про книгу Джо Селко?" - це суб’єктивне питання. Це питання вимагає об'єктивної інформації, просто так трапляється, що немає єдиної «правильної» відповіді. Я думаю, що важливо зробити крок назад і запитати, "це просто простої бари, або це корисно для деяких розробників?" Мої два центи все одно - це не так, як я заробляю реп-очки за це. :-)
Aaronaught

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

4
Я вважаю це досить цікавим: «Це спільнота Wiki і тому підходить». Як на Землі може CW це зробити відповідним? Або питання є підходящим, або ні, і я думаю, що це питання є способом суб'єктивного бути корисним, якщо хтось шукає відповідь. Це може бути цікаво, але це не єдина характеристика, яку має мати питання.
Георг Шоллі

Відповіді:


106

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

На жаль, відповідь на це - рухома мета. У період розквіту баз даних, починаючи з 1970-х на початку 1990-х, бази даних були для обміну даними. Якщо ви використовували базу даних, і ви не обмінювалися даними, ви або брали участь в академічному проекті, або витрачали ресурси, включаючи себе. Налаштування бази даних та приборкання СУБД були такими монументальними завданнями, що окупність, з точки зору даних, що експлуатувались неодноразово, мала бути величезною, щоб відповідати інвестиціям.

За останні 15 років бази даних стали використовуватись для зберігання стійких даних, пов’язаних лише з одним додатком. Побудова бази даних для MySQL або Access або SQL Server стала настільки звичайною, що бази даних стали майже звичайною частиною звичайного додатку. Іноді ця початкова обмежена місія підштовхується вгору повзанням місії, оскільки реальна цінність даних стає очевидною. На жаль, бази даних, які були розроблені з єдиною метою, часто різко виходять з ладу, коли їх починають відштовхувати від ролі, яка є загальноприйнятою та важливою для місії.

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

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

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

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

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

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

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

Вау!


Дуже добре написано! І історична перспектива чудово підходить для людей, які тоді не працювали з базами даних (тобто я).
Aaronaught

6
Чудово написано. І я думаю, що ваш останній пункт занадто часто ігнорується людьми, які намагаються «просто зробити це».
DaveE

1
Існує зв’язок між написаним нами та такими темами, як план пояснення, індексація та нормалізація даних. Я хотів би більш детально обговорити цей зв'язок на якомусь дискусійному форумі. ТАК це не такий форум.
Вальтер Мітті

1
Якщо ви побачили, що читаєте цього монстра, що не поспішає, уявіть, що відчувалося, як його написати! Я не збирався писати есе. Як тільки я почав, це просто здавалося, що тече. Хто додав сміливості, справді допоміг читачам, ІМО.
Уолтер Мітті

3
@Walter Ви надали пояснення для всіх своїх пунктів, окрім цього: "Друге, що розробникам потрібно дізнатися про бази даних, - це весь погляд на світ, орієнтований на дані. Світогляд, орієнтований на дані, сильніше відрізняється від світоглядного світогляду на процес, ніж що більшість розробників коли-небудь дізналися. Порівняно з цим розривом розрив між структурованим програмуванням та об'єктно-орієнтованим програмуванням порівняно невеликий ". Не могли б ви детальніше зупинитися на цьому? Ви заявили, що розрив великий, але, мабуть, я хотів би реально зрозуміти погляд, орієнтований на дані, і як він відокремлений від подання процесу.
jedd.ahyoung

73

Гарне питання. Нижче наведені деякі думки в не конкретному порядку:

  1. Нормалізація, принаймні до другої нормальної форми, є важливою.

  2. Цілісність посилань також є важливою з належними каскадними міркуваннями щодо видалення та оновлення.

  3. Добре та правильне використання обмежень для перевірки. Нехай база може зробити якомога більше роботи.

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

  5. Визначте послідовний підхід для первинних ключів та кластерних ключів.

  6. Не переоцінюйте. Вибирайте свої індекси розумно.

  7. Послідовне іменування таблиці та стовпців. Виберіть стандарт і дотримуйтесь його.

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

  9. Не захоплюйтесь курок. Вони мають своє використання, але можуть ускладнювати речі в поспіху.

  10. Будьте обережні з АДС. Вони чудові, але можуть спричинити проблеми з продуктивністю, коли ви не знаєте, як часто їх можуть викликати у запиті.

  11. Отримайте книгу Celko про дизайн баз даних. Чоловік зарозумілий, але знає свої речі.


1
обережно деталізувати пункт 4. Це тема, яка мене завжди заінтригувала.
Бред

9
@David: Я завжди вважав за краще розміщувати його в обох місцях. Таким чином ви захищені від помилок, а також від помилок користувача. Немає жодної причини робити кожен стовпчик нульовим або дозволяти вставляти в Monthколонку значення поза діапазоном 1-12 . Складні правила ведення бізнесу - це, звичайно, інша історія.
Aaronaught

1
@Brad - Більшість наших додатків на роботі були зроблені задовго до того, як були введені суцільні процеси програмування. Тому у нас ділова логіка розпорошена скрізь. Деякі з них є в інтерфейсі, деякі в середньому ярусі, а деякі в базі даних. Це безлад. ІМО, бізнес-логіка належить до середнього рівня.
Ренді Міндер

2
@David - Якщо ви абсолютно впевнені, що зміни бази даних відбуватимуться лише в додатках, то ви можете мати рацію. Однак це, мабуть, досить рідко. Оскільки користувачі, швидше за все, вводять дані безпосередньо в базу даних, добре застосовувати перевірку даних і в базі даних. Крім того, деякі типи перевірки просто більш ефективно виконуються в базі даних.
Ренді Міндер

1
Пункт №8 справді важливий. Як правильно відзначити типи стовпців, дуже важливо знати.
Кріс Вест

22

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

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

По-третє, розробникам потрібно зрозуміти базовий SQL, включаючи приєднання.

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

Вони повинні розуміти основні нормалізації, принаймні, перші три нормальні форми. Що б там не було, отримайте DBA. Для тих, хто має досвід роботи із залами судових засідань у США (і тут зараховуються випадкові телевізійні шоу), є мнемонічне "Залежить від ключа, всього ключа та нічого, крім ключа, тож допоможе тобі Кодд".

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

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

Вони повинні мати основні знання про те, як отримати план та як його читати загалом (принаймні, достатньо, щоб сказати, ефективні чи ні алгоритми).

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

Вони, звичайно, повинні знати, що не втручатися у виробничі дані, виробничий код або щось подібне, і вони повинні знати, що весь вихідний код переходить у VCS.

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


19

Основна індексація

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

  • Що індексується у вашій базі даних, а що ні:
  • Різниця між видами сканувань, способом їх вибору та способом написання запиту може впливати на цей вибір;
  • Концепція висвітлення (чому ви не повинні просто писати SELECT *);
  • Різниця між кластерним та некластеризованим індексом;
  • Чому більше / більші індекси не обов'язково кращі;
  • Чому слід намагатися уникати загортання стовпців фільтрів у функції.

Дизайнери також повинні знати про поширені антидіапазони індексів, наприклад:

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

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


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

1
@Edmund: Індекс охоплює запит, якщо всі вихідні поля є частиною індексу (або у вигляді індексованих стовпців або INCLUDEстовпців у SQL Server). Якщо єдиний доступний індекс для даного запиту не охоплює, то всі рядки повинні бути отримані один за одним, що дуже повільно працює, і значна частина часу оптимізатор запитів вирішить, що це не Не варто цього і виконувати повне сканування індексу / таблиці. Тому ви не пишете SELECT *- це практично гарантує, що жоден індекс не покриє запит.
Aaronaught

Дякую! Хоча як користувач PostgreSQL мені не потрібно турбуватися про подібні речі (поки що?): Індекси не містять інформації про видимість, тому кортежі таблиці завжди потрібно також сканувати. Однак загалом це виглядає як досить важливий фактор.
Едмунд

@Edmund: PostgreSQL може не мати INCLUDEстовпців (я не можу сказати точно), але це не означає, що ви не можете розміщувати стовпці, які ви хочете охопити, у фактичні дані індексу. Це нам довелося зробити ще за SQL Server 2000 днів. Покриття все ще має значення незалежно від того, на якій СУБД ви працюєте.
Aaronaught

16

Нормалізація

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

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

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


14

Як працюють індекси

Це, мабуть, не найважливіша, але напевно сама занижена тема.

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

Навіть більш досвідчені розробники можуть писати досить хороший (і складний) SQL, не знаючи більше про індекси, ніж " Індекс робить запит швидким ".

Це тому, що бази даних SQL роблять дуже гарну роботу, працюючи як чорний ящик:

Скажіть мені, що вам потрібно (gimme SQL), я подбаю про це.

І це ідеально підходить для отримання правильних результатів. Автору SQL не потрібно знати, що робить система за лаштунками, поки все не стане sooo slooooow .....

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

Тому я вважаю, що індексація - тема №1, яку не варто забувати під час роботи з базами даних . На жаль, забути це дуже просто.

Відмова від відповідальності

Аргументи запозичені з передмови моєї вільної електронної книги " Використовуйте індекс, Лука ". Я витрачаю досить багато часу на пояснення того, як працюють індекси та як правильно їх використовувати.


12

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

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

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


Ви маєте на увазі, як робити діаграми відносин між сутностями?
crosenblum

Так ... я забув згадати про ERD? :-)
FernandoZ

+1 ... Але ти повинен усвідомити, що ти на ТО: будинок сантехніків проводить свої дні, виправляючи невідповідність опору ORM, тому все, що вони знають, їдять і думають, це не просто реляційний, а "SQL" :)
SyntaxT3rr0r


9

Кожен розробник повинен знати, що це помилково: "Профілювання операції з базою даних повністю відрізняється від коду профілювання."

Існує чіткий Big-O в традиційному розумінні. Коли ви робите EXPLAIN PLAN(або еквівалент), ви бачите алгоритм. Деякі алгоритми включають вкладені петлі і є O ( n ^ 2). Інші алгоритми включають пошук B-дерева і є O ( n log n ).

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

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

Крім того, наслідок: більше показників не краще.

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


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

@Aaron: Ви дійсно є контроль над алгоритмами. Ось для чого індекси.
С.Лотт

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

@Aaron: Менший контроль не знімає обов'язку насправді розуміти, чи запит є * O ** (* n ^ 2) або * O ** (* n log n ) або просто ** O ** (n). Менший контроль не знімає зобов’язання насправді зрозуміти, що відбувається, і з’ясувати, як це контролювати.
С.Лотт

@ S.Lott: Я думаю, що ми тут на одній стороні, тому що я пропонував більший тягар для баз даних - "Вам потрібно знати ... [як] прочитати план запитів". Але мою редакцію, здається, відмовили назад, так що ... я думаю, вона зараз належить спільноті.
Aaronaught

8

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

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


Поясніть, будь ласка, що означає "підхід на основі"
Вівіан-Рівер

1
Щоб ви дивилися на дані як на множини, і розглядали ваші проблеми як потенційно вирішені набором арифметики - із залученням функцій ранжування, де це потрібно, підзапроси, агрегати тощо. Багато розробників замислюються над тим, що потрібно зробити для кожного ряду, яке ітеративне мислення.
Роб Фарлі

8

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

Ще одна річ, яку розробники повинні розуміти, це те, що ви маєте пам’ятати про три бажання:

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

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

  3. Безпека - ці дані є життєвою кров’ю вашої компанії, вони також часто містять особисту інформацію, яку можна викрасти. Дізнайтеся, як захистити свої дані від нападів ін'єкцій SQL та шахрайства та крадіжок особи.

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

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

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

Ніколи не розробляйте нову версію бази даних, ніж виробничу версію. Ніколи, ніколи, ніколи не розвивайтесь безпосередньо проти виробничої бази даних.

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

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


6

Еволюційне проектування баз даних. http://martinfowler.com/articles/evodb.html

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

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

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

Принаймні знайте, що концепція та методології рефакторингу баз даних існують. http://www.agiledata.org/essays/databaseRefactoringCatalog.html

Класифікація та опис процесу дозволяють застосовувати також інструменти для цих рефактори.


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

Дивіться також "Бази даних Refactoring" від Ambler ( amazon.com/Refactoring-Databases-Evolutionary-Database-Design/… ).
Джонатан Леффлер

5

З мого досвіду роботи з реляційними базами даних, кожен розробник повинен знати:

- різні типи даних :

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

- Дізнайтеся про 1xM та MxM :

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

- Принцип " KISS " застосовується і до БД :

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

- Індекси :

Мало, якщо ви знаєте, що вони є. Вам потрібно зрозуміти, коли ними користуватися, а коли не потрібно.


також:

  • Булева алгебра - твій друг
  • Зображення: не зберігайте їх у БД. Не питайте, чому.
  • Тест DELETE за допомогою SELECT

+1 для зображень. Я б замінив "Зображення" на "BLOBs".
Агнел Куріан

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

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

5

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


5

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


5

Про наступний коментар до відповіді Вальтера М.:

"Дуже добре написано! І історична перспектива чудово підходить для людей, які тоді не працювали з базами даних (тобто я)".

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

Що стосується самого питання:

Кожен розробник баз даних повинен знати, що "Реляційний" не дорівнює "SQL". Тоді вони зрозуміють, чому їх так безсильно відпускають постачальники СУБД, і чому вони повинні говорити тим самим постачальникам придумати кращі речі (наприклад, СУБД, які є справді реляційними), якщо вони хочуть продовжувати смоктати веселі суми гроші своїх клієнтів за таке хитре програмне забезпечення).

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


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

1
Якщо ви забули, Джордж Сантаяна, написав цю класичну цитату ...
crosenblum

5

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

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

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


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

5

Проста повага.

  • Це не просто сховище
  • Ви, мабуть, не знаєте краще, ніж постачальник або DBA
  • Ви не підтримаєте його о 3 ранку, коли старші менеджери кричать на вас

3

Розгляньте денормалізацію як можливого ангела, а не диявола, а також розглядайте бази даних NoSQL як альтернативу реляційним базам даних.

Крім того, я думаю, що модель Entity-Relation є обов'язковою інформацією для кожного розробника, навіть якщо ви не проектуєте бази даних. Це дозволить вам зрозуміти, про що йдеться у вашій базі даних.


3

Ніколи не вставляйте дані з неправильним кодуванням тексту.

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


2
Що таке "неправильне кодування тексту" і як це відбувається?
Геннадій Ванін Геннадій Ванін

1
@ vgv8, це відбувається, коли ваш клієнт дозволяє користувачам надсилати текст у будь-якому кодуванні, яке ви хочете, ви сліпо зберігаєте його. Потім, коли вам потрібно здійснити якусь трансформацію чи аналіз, ваш код порушується, тому що ваш додаток передбачає utf-8, але якийсь ідіот додав дані utf-16, і ваша програма помиляється або починає виплескувати гріш.
mikerobi

3

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

Знайте, як ваш двигун буде конкретно виконувати запит, який ви пишете.

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

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

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

Знайте процес виконання двигуна бази даних та плануйте його.


3

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

Кожен вихователь C ++ написав клас коледжу в коледжі. Кожен графічний витівник написав у коледжі рейсер. Кожен веб-гек писав інтерактивні веб-сайти (як правило, до того, як у нас були "веб-рамки") в коледжі. Кожен апаратний ботанік (і навіть програмний ботанік) вбудував процесор у коледж. Кожен лікар розсікав цілий труп у коледжі, навіть якщо вона лише здасть мені артеріальний тиск і скаже мені, що мій холестерин сьогодні занадто високий. Чому бази даних будуть різними?

На жаль, сьогодні вони чомусь здаються різними. Люди хочуть, щоб .NET-програмісти знали, як працюють струни в C , але внутрішня частина ваших RDBMS не повинна надто турбувати вас .

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

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


З прив’язаної статті Джоеля про струни C, чи не наступний фрагмент призводить до невизначеної поведінки: char * str = "* Привіт!"; str [0] = strlen (str) - 1; str - це рядковий літерал і є загальним для пам'яті лише для читання. Ви не можете йому написати:?
HeretoLearn

Професійний експерт із баз даних, добре, але кожен розробник ?
Бен Астон

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

2

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

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

Це сприяє можливості SQL Server створювати корисні статистичні дані щодо використання індексу під час виконання.


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

дякую, але якщо індекс був створений на 3 полях, виходячи з того, що конкретний запит sql буде використовувати ці 3 поля в його пункті, де, то порядок може бути значним, і поле з найвищою кардинальністю з’являється першим \ раніше призвести до покращення продуктивності .... або, принаймні, те, що я читав у книзі про налаштування продуктивності Microsoft SQL Server. Я спробував це, і, здавалося, вийшло краще (роки тому).
Майк Д

2

Розумійте інструменти, які використовуєте для програмування бази даних !!!

Я витратив стільки часу, намагаючись зрозуміти, чому мій код таємниче вийшов з ладу.

Наприклад, якщо ви використовуєте .NET, вам потрібно знати, як правильно використовувати об'єкти в System.Data.SqlClientпросторі імен. Вам потрібно знати, як керувати своїми SqlConnectionоб'єктами, щоб переконатися, що вони відкриті, закриті та, коли це необхідно, належним чином розміщені.

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


2
  • Основні навички SQL
  • Індексація.
  • Справа з різними втіленнями DATE / TIME / TIMESTAMP.
  • Документація драйверів JDBC для платформи, яку ви використовуєте.
  • Робота з бінарними типами даних ( CLOB , BLOB тощо)

1

Для деяких проектів краще орієнтована об'єктно-орієнтована модель.

Для інших проектів реляційна модель краще.



1

Сумісність RDBMS

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

  • уникайте розширень SQL RDBMS
  • усунути тригери та зберігати процедури
  • дотримуйтесь суворих стандартів SQL
  • конвертувати типи даних поля
  • зміни рівня ізоляції транзакцій

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


1

Не залежить від порядку рядків, повернутих за допомогою SQL-запиту.


3
... хіба що в ньому є ORDER BYзастереження?
Aaronaught

І не використовуйте ORDER BYзайве, оскільки це додає навантаження на сервер SQL
Вівіан Рівер

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