Является ли использование мастер-таблицы для общих столбцов хорошей практикой для всей базы данных?

Ниже я объясню базовый дизайн базы данных, над которой я работаю. Поскольку я не DB, я обеспокоен, нахожусь ли я на хорошей дорожке или на плохой, поэтому я хотел поместить это в стек для некоторого совета. Я не смог найти аналогичного обсуждения, подходящего моему дизайну.

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

  • люди
  • пользователей
  • Счета
  • AccountUsers
  • Адреса
  • Информация о сотруднике
  • Информация о подрядчике

И для хранения информации об этих сущностях у меня есть две таблицы:

Entity Tables
-EntityType
-> EntityTypeID (INT)
-Entities
-> EntityID (BIGINT)
-> EnitityType (INT) : foreign key

Каждая созданная мной таблица имеет первичный ключ, сгенерированный автоматически, и внешний ключ в столбце entityID таблицы Entities.

В таблице сущностей у меня есть некоторые общие поля, такие как,

  • Дата создания
  • Дата изменена
  • User_Created
  • User_Modified
  • IsDeleted
  • CanUIDelete

Я использую триггеры на всех таблицах, чтобы автоматически создать запись их сущности с правильным типом сущности на вставках. И триггеры обновления обновляют дату LastModified.

С точки зрения прикладного уровня, все, что должен сделать код, это беспокоиться об отдельных сущностях (за исключением полей USER_Modified/User_Created "он обновляет это" путем присоединения к entityID)

Теперь причина таблицы сущностей заключается в том, что я планирую использовать модель EAV, поэтому каждый тип сущности можно расширять с помощью настраиваемых полей. Он также служит хорошим местом для хранения метаданных о сущностях (например, созданных / измененных полей).

Я просто новичок в дизайне БД и хочу второго мнения.

2 ответа

Решение

Я планирую иметь модель EAV, поэтому каждый тип сущности может быть расширен с помощью пользовательских полей.

Зачем? Все ли ваши сущности должны быть расширяемыми таким образом? Вероятно, нет - в большинстве приложений есть один или два объекта, которые выиграли бы от этого уровня гибкости. Другие сущности на самом деле выигрывают от стабильности и ясности, что они не меняются постоянно.

EAV является примером эффекта внутренней платформы:

Эффект Inner-Platform является результатом разработки системы, которая будет настолько настраиваемой, что в конечном итоге станет плохой копией платформы, с которой она была разработана.

Другими словами, теперь вы несете ответственность за написание кода приложения для выполнения всего того, что уже обеспечивает надлежащая СУБД, например ограничений и типов данных. Даже что-то простое, например, обязательное создание столбца NOT NULL не работает в EAV.

Это правда, иногда проект требует много таблиц. Но вы обманываете себя, если думаете, что упростили проект, сделав всего две таблицы. У вас по-прежнему будет столько же разных сущностей, сколько у вас было бы столов, но теперь вам нужно не дать им превратиться в груду мусора.

Прежде чем тратить слишком много времени на EAV, прочитайте эту историю о компании, которая почти перестала функционировать, потому что кто-то пытался сделать свое хранилище данных произвольно гибким: Bad CaRMa.

Я также написал больше о EAV в сообщении в блоге, EAV FAIL, и в главе моей книги, SQL Antipatterns: Как избежать подводных камней программирования баз данных.

Вы действительно не дали дизайн. Если бы вы дали описание таблиц, ориентированный на приложение критерий того, когда в каждую строку входит строка, и соответствующие ограничения, включая ключи, fks и т. Д. Для части вашего приложения, включающей ваши сущности, то вы бы дали часть дизайна. Другими словами, если бы вы дали этой части простой реляционный дизайн. (То, что вы не реализуете его таким образом, не означает, что вам не нужно проектировать должным образом.) Обратите внимание, что это должно включать состояние уровня приложения и функциональность для "расширения с помощью пользовательских полей". Но затем вы должны дать описание таблиц, критерий, когда в каждую из них входит строка, и соответствующие ограничения, включая ключи, fks и т. Д. Для той части вашей реализации, которая кодирует предыдущую часть через EAV, плюс операторы для манипулирования ими. Другими словами, если бы вы дали этой части простой реляционный дизайн. Часть вашего проекта, которая реализует СУБД. Тогда вы бы действительно дали дизайн.

Представление о том, что нужно использовать EAV "чтобы каждый тип сущности можно было расширять с помощью настраиваемых полей", ошибочно. Просто реализуйте через вызовы, которые обновляют таблицы метаданных иногда вместо простого обновления обычных таблиц: DDL вместо DML.

Другие вопросы по тегам