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


38

Мій начальник зараз намагається застосувати деякі стандарти розвитку до нашої команди, тому ми вчора провели нараду, щоб обговорити стандарти, які в основному йшли добре, поки вона не виховується:

  • Усі таблиці БД матимуть стовпчик CreatedDate та LastUpdatedDate, оновлений тригерами.

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

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

Отже, моє запитання двояке:

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

Чому ви кажете, що C # не задоволений ORM? Крім того, додавання властивостей [insert = "false" update = "false" generated = "always"] до відображення цих двох стовпців у NHibernate, наприклад, не здається мені незручним, чи я щось пропускаю?
Джалайн

C # + Oracle не задоволений ORM, і ми виявили, що NHibernate був надто важким (очевидно, я не брав участі в цьому розслідуванні інструментів). Я, мабуть, поставив C # і Oracle назад у головному питанні.
Ед Джеймс

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

Як би це забрало час від усього? Вам доведеться зробити це щонайменше двічі для «зовнішніх справ». Створіть інструмент і кілька класів для багаторазового використання і більше ніколи не переживайте про це.
Стівен Еверс

Відповіді:


27

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

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

Відмова від відповідальності: Однак є набагато кращі способи досягнення сліду аудиту бази даних> https://stackoverflow.com/questions/1051449/ideas-on-database-design-for-capturing-audit-trails


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

6
"(ВСЕ що реєструється досить ретельно)" , що включає CreateDate та LastUpdatedDate? Якщо так, можливо, ви можете вказати колегам на принцип DRY :)
MattDavey

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

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

@ Jordão Я сказав, що це звичайний підхід, я не сказав, що це був хороший! Звідси відмова :)
MattDavey

17

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

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

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


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

3
+1 Ви зможете легко створити сценарії за декілька днів. Тільки багато роботи, якщо це робиться вручну.
Джон Рейнор

8

... чим більше остаточних тверджень людина робить тим більше шансів на те, що він остаточно помилиться ... - Тайлер Дерден

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

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


8

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

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

Є два основні способи зробити це:

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

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

Ще однією перевагою наявності цих полів є сховище даних та ODS, які ЗАВЖДИ побудовані для будь-якої системи OLTP. Ви не можете ефективно витягувати додаткові дані без них. В іншому випадку ви ризикуєте щодня перезавантажувати всю БД.

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

Я реалізував і, як правило, рекомендую обидва рішення, де це можливо.


5

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

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

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

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


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

Одиничні тести є окремими від аудиту. Я згадую, що це може спричинити помилку, тому що я бачив це, навіть коли були одиничні тести, тому що був неперевірений крайній випадок. Він також може вказати, що дані були введені до виправлення помилки, і тоді вам може знадобитися знайти інші дані, які також потребують виправлення. Або просто знайте, що саме дані, введені під час імпорту 6 червня 2016 року, допоможуть вам зрозуміти, чи була проблема у вашому імпорті чи щось не так із даними у файлі імпорту. Це набагато простіше, ніж переглядати щорічні файли щоденного імпорту.
HLGEM

4

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

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

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


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

1

Це було б досить тривіально для впровадження (можливо, всього 1–3 дні), тому, на мою думку, його велику цінність він додасть до вашої програми протягом свого життя.

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

По-друге, для стовпців, використовуючи значення за замовчуванням, як-от GetUTCDate () (SQL Server, Oracle, можливо, інший), вирішуються будь-які доповнення кодування на вкладиші, тому база коду не повинна змінюватися для жодного з виписок вставок, оскільки значення за замовчуванням будуть б / в.

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

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


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

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

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

2
@Ed - Погоджено, немає довіри, ось що таке огляди коду! :)
Джон Рейнор
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.