Я собираюсь поделиться с вами своим дизайном, и он отличается от ваших обоих проектов тем, что для каждого типа сущности требуется одна таблица. Я нашел лучший способ описать любой дизайн базы данных через ERD, вот мой:
В этом примере у нас есть сущность с именем employee . user таблица содержит записи ваших пользователей, а entity и entity_revision - это две таблицы, в которых хранится история изменений для всех типов сущностей, которые будут у вас в системе. Вот как работает этот дизайн:
Два поля entity_id и revision_id
Каждая сущность в вашей системе будет иметь уникальный идентификатор сущности. Ваша сущность может пройти ревизию, но ее entity_id останется прежним. Вы должны сохранить этот идентификатор сущности в своей таблице сотрудников (как внешний ключ). Вам также следует сохранить тип вашей сущности в таблице сущность (например, «сотрудник»). Теперь, что касается revision_id, как видно из его названия, он отслеживает изменения вашей сущности. Лучший способ, который я нашел для этого, это использовать employee_id в качестве вашего revision_id. Это означает, что у вас будут повторяющиеся идентификаторы ревизий для разных типов сущностей, но это меня не касается (я не уверен в вашем случае). Единственное важное замечание: комбинация entity_id и revision_id должна быть уникальной.
В таблице entity_revision также есть поле state , в котором указано состояние ревизии. Он может иметь одно из трех состояний: latest
, obsolete
или deleted
(если вы не полагаетесь на дату пересмотра, это значительно повышает ваши запросы).
Последнее замечание по revision_id: я не создал внешний ключ, соединяющий employee_id с revision_id, потому что мы не хотим изменять таблицу entity_revision для каждого типа сущности, который мы могли бы добавить в будущем.
ВСТАВКИ
Для каждого сотрудника , который вы хотите вставить в базу данных, вы также добавите запись в entity и entity_revision . Эти последние две записи помогут вам отслеживать, кем и когда запись была вставлена в базу данных.
UPDATE
Каждое обновление для существующей записи сотрудника будет реализовано в виде двух вставок: одна в таблице сотрудников и одна в entity_revision. Второй поможет вам узнать, кем и когда была обновлена запись.
УДАЛЕНИЕ
Для удаления сотрудника в entity_revision вставляется запись с указанием удаления и делается.
Как вы можете видеть в этом проекте, никакие данные никогда не изменяются и не удаляются из базы данных, и что более важно, для каждого типа сущности требуется только одна таблица. Лично я нахожу этот дизайн действительно гибким и простым в работе. Но я не уверен в тебе, потому что твои потребности могут быть другими.
[UPDATE]
Поддерживая разделы в новых версиях MySQL, я считаю, что мой дизайн также обладает одним из лучших показателей. Можно разделить таблицу entity
с помощью поля type
, а раздел entity_revision
- с помощью поля state
. Это значительно повысит количество запросов SELECT
, а дизайн будет простым и понятным.