Коли таблиця бази даних повинна використовувати часові позначки?


19

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

Мені було цікаво, коли в таблицю бази даних повинні бути створені та оновлені часові позначки?

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

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

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

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

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


2
Я думаю, ви вже самі відповіли на питання. Єдина відповідь, яку можна дати, - це "Це залежить від сценарію".
Філіп

3
На практиці я маю часові позначки майже на кожному столі (в основному з причин, які ви згадуєте). Наскільки я можу сказати, це не має негативних наслідків для продуктивності, принаймні для типу баз даних, які зазвичай використовуються в веб-розробці, можливо, близько 30 000 статей і сотень тисяч замовлень (для будь-якого часу потрібні часові позначки). Можливо, існують крайові випадки, але, наприклад, наша система ERP (Microsoft Navision) має ці часові позначки і на більшості таблиць.
thorsten müller

2
Ви кажете, що давати кожній таблиці часову позначку - це, безумовно, чудовий спосіб швидко заблокувати базу даних , але ви не кажете, чому. Майже в кожній СУБД часова мітка має дуже мале значення - зазвичай це 8 байт або менше. Якщо ви не додаєте індекси, це незначно.
Росс Паттерсон

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

@PieterB Однозначно важливо зберігати історію для деяких таблиць, але я ніколи не стикався з випадком, коли ви хотіли б зробити це для кожної таблиці - YMMV.
Роббі Ді

Відповіді:


5

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

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

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

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


15

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

Простіше кажучи:

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

Для будь-якої таблиці, де записи додаються та оновлюються, я б розглядав можливість додавання стовпця DATE_CREATED та DATE_UPDATED.

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

Для більших баз даних з мільйонами / мільярдами рядків, де оновлення бази даних тривало протягом декількох днів, ми також додали стовпець ДЖЕРЕЛ для деяких таблиць, які відстежували, який потік даних викликав оновлення, наприклад, стороннє джерело, оновлення користувача, модифікація DBA, очищення даних тощо


6

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

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

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

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


+1 Це також є загальною технікою, яку можна використовувати за допомогою тригерів таблиці, щоб кинути запис у таблицю історії, яку потім можна дельтировать. Деякі RDBMS (наприклад, функція Flashback від Oracle) також підтримують використання запитів у поточний час, коли стан даних у певний момент минулого можна перевірити.
Роббі Ді

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

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

1

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

  1. Таблиця представляє первинний запис деякої діяльності, що надається користувачем. Якщо користувач робить X, а у вас є і a, Table_Xі a, Table_Yякі є одним з багатьох дітей Table_X, Table_Yце не первинний запис, і тому не потрібні додаткові поля.
  2. Коли у вас є постійна, тимчасова або повторювана потреба у відстеженні системи . Якщо у вас є необхідність перевірити, що Table_Yоновлюється лише після Table_Xоновлення, можуть допомогти додаткові поля відстеження.

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


0

Особиста думка:

Я не бачу значення в modifiedстовпці.

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

Однак, updatedздається, марно. Чому б просто не пройти цілу свиню, зробити дві таблиці бази даних, одну, в якій вказано ідентифікатор документа, а іншу - версію документа. У дуже спрощеному випадку

create table document (
    id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    created TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
);

create table version (
    id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    document_id INT NOT NULL REFERENCES document(id),
    content TEXT NOT NULL,
    created TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
);

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

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