目标是存储诸如插入、更新和删除业务记录之类的活动。
我正在考虑的一种解决方案是对每条记录使用一个表进行跟踪。这是一个简化的示例:
CREATE TABLE ActivityTypes
(
TypeId int IDENTITY(1,1) NOT NULL,
TypeName nvarchar(50) NOT NULL,
CONSTRAINT PK_ActivityTypes PRIMARY KEY (TypeId),
CONSTRAINT UK_ActivityTypes UNIQUE (TypeName)
)
INSERT INTO ActivityTypes (TypeName) VALUES ('WidgetRotated');
INSERT INTO ActivityTypes (TypeName) VALUES ('WidgetFlipped');
INSERT INTO ActivityTypes (TypeName) VALUES ('DingBatPushed');
INSERT INTO ActivityTypes (TypeName) VALUES ('ButtonAddedToDingBat');
CREATE TABLE Activities
(
ActivityId int IDENTITY(1,1) NOT NULL,
TypeId int NOT NULL,
AccountId int NOT NULL,
TimeStamp datetime NOT NULL,
CONSTRAINT PK_Activities PRIMARY KEY (ActivityId),
CONSTRAINT FK_Activities_ActivityTypes FOREIGN KEY (TypeId)
REFERENCES ActivityTypes (TypeId),
CONSTRAINT FK_Activities_Accounts FOREIGN KEY (AccountId)
REFERENCES Accounts (AccountId)
)
CREATE TABLE WidgetActivities
(
ActivityId int NOT NULL,
WidgetId int NOT NULL,
CONSTRAINT PK_WidgetActivities PRIMARY KEY (ActivityId),
CONSTRAINT FK_WidgetActivities_Activities FOREIGN KEY (ActivityId)
REFERENCES Activities (ActivityId),
CONSTRAINT FK_WidgetActivities_Widgets FOREIGN KEY (WidgetId)
REFERENCES Widgets (WidgetId)
)
CREATE TABLE DingBatActivities
(
ActivityId int NOT NULL,
DingBatId int NOT NULL,
ButtonId int,
CONSTRAINT PK_DingBatActivities PRIMARY KEY (ActivityId),
CONSTRAINT FK_DingBatActivities_Activities FOREIGN KEY (ActivityId)
REFERENCES Activities (ActivityId),
CONSTRAINT FK_DingBatActivities_DingBats FOREIGN KEY (DingBatId)
REFERENCES DingBats (DingBatId)
CONSTRAINT FK_DingBatActivities_Buttons FOREIGN KEY (ButtonId)
REFERENCES Buttons (ButtonId)
)
该解决方案似乎适用于获取给定小部件或 dingbat 记录 ID 的所有活动,但是对于获取所有活动然后尝试确定它们引用的记录似乎不太好。
也就是说,在此示例中,所有帐户名称和时间戳都存储在单独的表中,因此可以轻松创建专注于用户和专注于时间间隔的报告,而无需知道具体的活动是什么。
但是,如果您确实想特别按类型报告活动,则此解决方案将需要确定一般活动表所指的活动类型。
我可以将所有活动类型放在一个表中,但是 ID 不能受外键约束,而是可以将表名用作 id,这将导致我使用动态查询。
注意示例中的 DingBatActivity 有一个可选的按钮 ID。如果按钮名称在添加到 dingbat 后已被编辑,则活动将能够引用该按钮并知道其名称,因此如果报告按 dingbat 和按名称按按钮列出所有活动,则按钮名称会更改将自动反映在活动描述中。
寻找其他一些想法以及这些想法如何在编程工作、数据完整性、性能和报告灵活性之间取得平衡。