То, как я обычно создаю решение этой проблемы, похоже на наследование в объектах. Если у вас есть «действия», которые происходят с определенными объектами, и вы хотите отслеживать эти действия, то участвующие объекты почти наверняка имеют нечто общее. Там твой базовый стол. Оттуда вы можете создавать подтаблицы вне базовой таблицы, чтобы отслеживать вещи, специфичные для этого подтипа. Например, вы можете иметь:
CREATE TABLE Objects -- Bad table name, should be more specific
(
object_id INT NOT NULL,
name VARCHAR(20) NOT NULL,
CONSTRAINT PK_Application_Objects PRIMARY KEY CLUSTERED (application_id)
)
CREATE TABLE Widgets
(
object_id INT NOT NULL,
height DECIMAL(5, 2) NOT NULL,
width DECIMAL(5, 2) NOT NULL,
CONSTRAINT PK_Widgets PRIMARY KEY CLUSTERED (object_id),
CONSTRAINT FK_Widgets_Objects
FOREIGN KEY (object_id) REFERENCES Objects (object_id)
)
CREATE TABLE Dingbats
(
object_id INT NOT NULL,
label VARCHAR(50) NOT NULL,
CONSTRAINT PK_Dingbats PRIMARY KEY CLUSTERED (object_id),
CONSTRAINT FK_Dingbats_Objects
FOREIGN KEY (object_id) REFERENCES Objects (object_id)
)
Теперь для вашей деятельности:
CREATE TABLE Object_Activities
(
activity_id INT NOT NULL,
object_id INT NOT NULL,
activity_type INT NOT NULL,
activity_time DATETIME NOT NULL,
account_id INT NOT NULL,
CONSTRAINT PK_Object_Activities PRIMARY KEY CLUSTERED (activity_id),
CONSTRAINT FK_Object_Activities_Objects
FOREIGN KEY (object_id) REFERENCES Objects (object_id),
CONSTRAINT FK_Object_Activities_Activity_Types
FOREIGN KEY (activity_type) REFERENCES Activity_Types (activity_type),
)
CREATE TABLE Dingbat_Activities
(
activity_id INT NOT NULL,
button_id INT NOT NULL,
CONSTRAINT PK_Dingbat_Activities PRIMARY KEY CLUSTERED (activity_id),
CONSTRAINT FK_Dingbat_Activities_Object_Activities
FOREIGN KEY (activity_id) REFERENCES Object_Activities (activity_id),
CONSTRAINT FK_Dingbat_Activities_Buttons
FOREIGN KEY (button_id) REFERENCES Object_Activities (button_id),
)
Вы можете добавить код типа к базовому действию, если хотите указать тип объекта, на который он влияет, или вы можете просто определить это путем поиска существования в подтаблице.
Вот предостережение big : убедитесь, что объекты / действия действительно имеют что-то общее, что их связывает, и требует, чтобы вы пошли по этому пути. Вы не хотите хранить несвязанные, несвязанные данные в одной таблице. Например, вы можете использовать этот метод для создания таблицы, в которой будут храниться как транзакции с банковскими счетами, так и небесные события, но это не очень хорошая идея. На базовом уровне у них должно быть что-то общее.
Кроме того, я предположил, что все ваши действия были связаны с учетной записью, поэтому он находится в базовой таблице. Все, что общего со ВСЕМИ видами деятельности, заносится в базовую таблицу. Вещи, относящиеся только к подтипу, попадают в эти таблицы. Вы даже можете пройти несколько уровней, но не увлекайтесь. То же самое относится и к объектам (опять же, плохое имя здесь, но я не уверен, с чем вы на самом деле имеете дело). Если все ваши объекты имеют цвет, вы можете поместить его в таблицу объектов. Если нет, то это пойдет в под-таблицы.