Чи є безперервне створення та видалення таблиць ознакою архітектурного недоліку?


11

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

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


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

24
700 таблиць і не вистачає часу на рефактор? Я відчуваю запах невдачі всюди тут.
Адам Кросленд

7
700 ВИКОРИСТАНИХ таблиць або 700 таблиць, багато з яких є сиротами?
Бен Брокка

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

1
@maple_shaft Звичайно, будь-якою технологією можна зловживати, як і будь-що інше, ви повинні зважити плюси та мінуси та протестувати, тестувати, тестувати. Матеріалізовані погляди, однак, можуть запропонувати вам вихід, якщо ви виявите, що ви денормалізуєте свої таблиці. Я думаю, що ваш погляд - це лише ще одна причина, щоб мати DBA або хоча б розробника з потужним DB-fu для персоналу, щоб тягнути лейці назад, коли всі інші заряджаються вперед з явно поганим дизайном. Моя найкраща робота прийшла не під час кодування чи дизайну, а заважала іншим приймати жахливі, жахливі рішення.
Майк Челліні

Відповіді:


21

Мені з кожним днем ​​стає все очевидніше, що "спритний" стає синонімом погано продуманих, хаотичних, поспішних і штанів. І жодна з цих речей не сумісна з Agile підходом, як я розумію.

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

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

Зрештою, Agile - це лише слово. Те, що ви робите щодня, визначає, чи будете ви успішними чи ні.


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

1
@maple_shaft, просто так. Бути Agile не усуває важку роботу з будівельних виробів.
Адам Кросленд

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

Добре сказано, Джефф О.
Адам Кросленд

11

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

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

DBA допоможе, просто переконайтеся, що ви отримали DBA, який розуміє розвиток, а також Agile development. Ваша команда розробників потребує пересилення, а не кидання у в'язницю.


5

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

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

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


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

Саме так. Не турбуйтеся про велику кількість таблиць, більшість з них все одно не використовуються, і, можливо, їх скоро випадуть. SCNR
user281377

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

4

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

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


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

5
Однозначно програму Cowboy тоді. Якщо у вас є команда з управління, яка стоїть за цим «спритним» зусиллям, переконайтеся, що це команда перешкоджає їм, що вони зловживають Agile та просто працюють amok.
Білл Ліпер

1
@RobZ Agile - це не привід для поганого покриття тестових одиниць та поганого дизайну бази даних. Це звучить як гарячий безлад.
maple_shaft

2
тьфу! не врізався !!! недарма це безлад. Я здригаюся, думаючи, що таке код програми.
ozz

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

3

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

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

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


У який момент у гнучкому процесі магічно з'являється відповідна модель для всіх майбутніх запитів на зміни?
JeffO

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

@Dibbeke: І тоді у вас виникають бізнес-проблеми, такі як розгляд ЄС (27 країн) як єдиної країни у випадках X, Y та Z. або трактування штатів США як країн. Або бізнес-усвідомлення того, що деякі записи БД мають 2 представлення адреси для однієї адреси.
MSalters

3

Щоб відповісти на ваше запитання, ні, це не нормально в процесі Agile.

Там, де це може здатися сприятливим ставленням, - це цикл проектування / розробки / тестування Agile на короткий ітерацій, а акцент Agile - на легкі рішення, що відповідають відомим вимогам, але добре структуровані, щоб можна було відповідати новим вимогам мінімальна зміна. З огляду на ці дві речі, ви можете сказати, що розробник, не знаючи, що може вийти на лінію, але знаючи його зміну, не повинен впливати на БД способом, який неможливо відмінити, просто вносить необхідні зміни в схему в "найлегшим" можливим способом, і тоді з інтервалом кілька наборів "легких" змін будуть перетворені на щось більш постійне і стабільне.

Сказавши це, я ще не працював із розробником, який підписався на теорію та методологію Agile, а також вважав, що регулярно створювати та видаляти таблиці в схемі необхідно з будь-якої причини. Agile не означає удару по штриху чи болта. Якщо вам надається історія, яка вимагає додавання нового поля даних, що належать до певного запису, ви додаєте поле до таблиці. Якщо ця зміна щось порушує, ви з'ясовуєте, чому, і вносите інші зміни, можливо, це можливо (я можу придумати дуже мало речей, які б зламалися, додавши стовпець до запиту БД; якщо він перерветься при такому зміні ви мають більші проблеми). Рефакторинг, як правило, обмежується кодом; Зміна схеми, як правило, є більш задіяним процесом, ніж зміна коду, і тому, коли відбуваються зміни схеми, вони зазвичай робляться більш уважно, і хоча б деяку увагу приділено знанням майбутнього напряму проекту. Необхідність переструктурувати частину або всю базу даних вказує на принциповий збій дизайну; те, що бути Agile, не означає, що не існує "загального плану" основних архітектурних та дизайнерських правил, який слід дотримуватися, органічно будуючи програму та структуру даних.

Зараз у Agile є випадки, коли те, що ви зараз «знаєте», буде суперечити тому, про що ви дізнаєтесь пізніше. Скажімо, у вас є вимога, щоб ваша система мала адресу для кожної людини. Оскільки це співвідношення 1: 1 і дані будуть потрібні у більшості випадків, ви просто додаєте поля Адреса до таблиці Особи. Через тиждень ви отримуєте вимогу, що особа може мати більше однієї адреси. Тепер це відношення 1: N, і щоб правильно їх моделювати, потрібно скасувати попередні зміни, розділивши поля на нову таблицю адрес. Це не буденно, особливо серед старших розробників. Досвідчений розробник побачить, що у Особи є адреса, розгляне їх як концептуально окремі, і створить таблицю Person та таблицю Адреса, пов'язуючи Person з Address з FK посиланням на AddressID. Таку схему, як ця, легше змінити, якщо зміниться характер відносин; не створюючи і не видаляючи цілих "широких" таблиць даних, відносини між особою та адресою можна досить легко змінити від 1: 1 до 1: N до N: N.


2

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

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

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


2

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


2

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

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


1

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


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

6
Agile - це не про кодування. Йдеться про процес розробки програмного забезпечення, який, безумовно, включає бази даних, якщо робоче програмне забезпечення залежить від бази даних. Сказавши це, я погоджуюся з вашим твердженням, що Agile не означає "діяти зараз плануй пізніше".
Ерік Кінг

@maple_shaft тільки тому, що схема db трактується як код, не робить її кодом. До домашніх тварин ставляться як до людей, але це не робить їх людьми
Ryathal

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

1

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

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

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