Які найкращі практики щодо вилучення застарілих стовпців бази даних? [зачинено]


14

Я розробляю програму, яка на ранньому етапі збиратиме дані A, B і C від клієнтів, але згодом натомість збиратиме дані A, B та D.

А, В, С і D дуже пов'язані і зараз існує в вигляді стовпців однієї бази даних PostgreSQL таблиці T .

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

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

Я міг просто залишити стовпчик C уздовж і видалити посилання на нього в коді, що дозволить існуючим даним вижити.

Чи є кращий варіант, якого я не бачу?

Деякі додаткові деталі:

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


Я думаю, що правильний спосіб підходу до цього залежить від того, якщо вам потрібно буде розрізняти рядки, зібрані з {A, B, C}, і рядки, зібрані з {A, B, D}, і якщо так, якщо ваші поточні дані Модель дозволяє це. І це також буде залежати від того, що ви збираєтеся робити з тими рядками, зібраними з {A, B, C} - нова версія програми показує їх як {A, B, D} з порожнім "D", але користувач не бачить вмісту стовпця C, він може спокусити видалити цей рядок із db (якщо додаток дозволяє видалити рядки), оскільки він не бачить вмісту.
Док Браун


Чи коли-небудь рядки з C і D збираються одночасно? Або це завжди буде A, B, C, Null або A, B, Null, D? Якщо у вас є C, D на одних і тих же рядках протягом короткого періоду ... у чому причина відсутності таблиць A, B, C і та A, B, D? Ми говоримо ... сотні рядків даних? Мільйони? мільярди? Чи є фактором час відповіді? Безліч деталей, які роблять кожну ситуацію унікальною ...
WernerCD,

@WernerCD додав деякі деталі щодо моєї справи у запитанні
Jad S

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

Відповіді:


31

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


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

8
можливо, вони могли б попросити кращого підходу до практики stackexchange .... коли це станеться
Ewan

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

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

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

8

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

Це еквівалентно відносинам спадкового класу

class All
{
    string A;
    string B;
}

class Old : All
{
    string C;
}

class New : All
{
    string D;
}

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

table All
    id varchar
    A varchar
    B varchar

table Old
    id varchar
    C  varchar

table New
    id varchar
    D  varchar

Таким чином, ви можете створити сценарій міграції для створення нової старої таблиці, скопіюйте в неї дані id та C та видаліть стовпець C із таблиці «Усі».

Оновлення коду, як потрібно, за допомогою нового sql;

Крім того, якщо вам просто потрібно мати змогу запитувати старі дані C, ви можете створити нову таблицю архіву з A, B, C скопіювати всі дані та видалити стовпець C, додайте колонку D до своєї таблиці "Live"


1
Якщо я розділю таблиці, я б краще взяв їх три: {A, B} {C} {D}
Аконкагуа,

це не відповідає прикладу?
Еван

чекати. я сумую за читанням
Еван

2

Якщо зберігання даних може викликати занепокоєння, розділіть таблиці: ключ / ключ A / B / клавіша C / D

Ви можете здійснити доступ або через перегляд (визначення місця розташування даних у db), або за допомогою зміни визначення ORM.

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

Можливо, вам не пощастить із можливістю простою, реструктуризації таблиць тощо у виробничій системі.

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

Дійсно, я думаю, що ваше рішення відображатиме безліч проблем, пов'язаних з реальним світом: 1) які типи даних C & D 2) відносні обсяги даних, зібрані для C / D 3) відносне перекриття даних C / D порівняно із суто записами C або D 4) Доступність і тривалість вікна простою / технічного обслуговування 5) Підтримка СУБД для оновлених представлень 6) Бажаність збереження деталей фізичної структури db в ОРМ порівняно з прозорістю шляхом подання через представлення даних / функцій у db (де це однаково для всіх доступу) додатки, а не лише поточні)

Моя відповідь вважала за краще великі / складні типи даних для (1), невеликого перекриття для (3) та мінімального простою для (4), в ідеалі з хорошою підтримкою dbms у (5) та декількох додатках, що мають доступ до даних у (6)

Але для багатьох альтернатив немає правильного / неправильного: - почніть з A / B / C, пізніше додайте D, регулюючи ORM, ще пізніше скиньте стовпець C - почніть з A / B / C / D & ігноруйте нулі тощо. Я думаю , врахуйте своє рішення та те, що ви знаєте про його цільове призначення / життєвий цикл, зробіть кілька моделювання розмірів / обсягів і сподівайтеся, що зміниться пізніше, оскільки не все виверне наше, як очікувалося.


1

Видалення посилань та осиротіння даних - це варіант низького ризику.

Завжди є можливі невідомі «бекдорні» способи використання даних, які можуть бути або не важливими для викриття, видаляючи стовпець.

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

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


1

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

Я не знаю Джанго ОРМ, але це може бути можливість.


2
ОП заявила, що вони використовують Postgres.
TripeHound

Дякую - не бачив тег. Я відредагую Q.
Роббі Ді

0
  • У вас є таблиця A зі стовпцями a, b, c.
  • Створіть нову таблицю B зі стовпцями a, b, d.
  • Перенесіть свої дані в таблицю B.
  • Перемістіть зовнішні ключі до таблиці А до таблиці Б.

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

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