Я збираюся поділитися з вами своїм дизайном, і він відрізняється від ваших обох конструкцій тим, що для нього потрібна одна таблиця для кожного типу сутності. Я знайшов найкращий спосіб описати будь-який дизайн бази даних через ERD, ось мій:
У цьому прикладі ми маємо юридичну особу на ім’я співробітник . користувальницька таблиця містить записи ваших користувачів, а сутність та сутність_ревізії - це дві таблиці, що містять історію ревізій для всіх типів об'єктів, які ви матимете у вашій системі. Ось як працює ця конструкція:
Два поля entit_id та revision_id
Кожна сутність у вашій системі матиме свій унікальний ідентифікатор сутності. Ваша організація може пройти зміни, але її_мення_код залишиться тією самою. Потрібно зберегти цей ідентифікатор сутності у вашій таблиці працівника (як зовнішній ключ). Ви також повинні зберігати тип вашої організації в таблиці сутності (наприклад, "співробітник"). Тепер, що стосується revivision_id, як показує його назва, він відслідковує зміни вашої сутності. Найкращий спосіб, який я знайшов для цього, - це використовувати служитель_id як свою ревізію. Це означає, що у вас будуть дублікати ідентифікаторів редакції для різних типів організацій, але це не стосується мене (я не впевнений у вашому випадку). Єдине важливе зауваження, яке слід зробити, - це те, що комбінація entit_id та revision_id має бути унікальною.
Там також стан поля в entity_revision таблиці , яка вказує на стан перегляду. Він може мати одне з трьох станів: latest
, obsolete
абоdeleted
(не покладаючись на дату перегляду допоможе вам багато , щоб підвищити свої запити).
Останнє зауваження про revivision_id, я не створив зовнішній ключ, що з'єднує_захисний_в_завдання до ревізіонного_, тому що ми не хочемо змінювати таблицю сутностей_ревізії для кожного типу об'єкта, який ми могли б додати в майбутньому.
ВСТУП
Для кожного співробітника, якого ви хочете вставити в базу даних, ви також додасте запис до entity та entit_revision . Ці два останні записи допоможуть вам відстежувати, хто і коли запис вставив у базу даних.
ОНОВЛЕННЯ
Кожне оновлення для існуючого запису працівника буде реалізовуватися у вигляді двох вставок, одна в таблиці службовців та одна в entit_revision. Другий допоможе вам дізнатися, ким і коли було оновлено запис.
ВИДАЛЕННЯ
Для видалення працівника запис у_ревізію вставляється запис, в якому зазначається про видалення та зроблено.
Як ви бачите в цьому дизайні, жодні дані ніколи не змінюються і не видаляються з бази даних, і що ще важливіше, кожен тип сутності вимагає лише однієї таблиці. Особисто я вважаю цей дизайн дійсно гнучким і простим у роботі. Але я не впевнений у вас, оскільки ваші потреби можуть бути різними.
[ОНОВЛЕННЯ]
Підтримуючи розділи в нових версіях MySQL, я вважаю, що моя конструкція також має одне з найкращих показників. entity
Таблицю можна розділити, використовуючи type
поле, тоді як розділ entity_revision
використовує його state
поле. Це збільшить SELECT
запити набагато, при цьому збереже дизайн і простий дизайн.