目標は、ビジネスレコードの挿入、更新、削除などのアクティビティを保存することです。
私が検討している解決策の1つは、追跡するレコードごとに1つのテーブルを使用することです。簡単な例を次に示します。
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を指定してすべてのアクティビティをフェッチするのに適しているように見えますが、すべてのアクティビティをフェッチして、それらが参照するレコードを判別しようとするのにはあまり適していません。
つまり、この例では、すべてのアカウント名とタイムスタンプが別のテーブルに格納されているため、特にアクティビティが何であるかを知らなくても、ユーザーと時間間隔に焦点を当てたレポートを簡単に作成できます。
ただし、特にタイプ別にアクティビティについてレポートする場合、このソリューションでは、一般的なアクティビティテーブルがどのタイプのアクティビティを参照しているかを判断する必要があります。
すべてのアクティビティタイプを1つのテーブルに入れることはできますが、IDを外部キーで制約することはできず、代わりにテーブル名がIDとして使用される可能性があり、動的クエリを使用することになります。
この例では、DingBatActivityにオプションのボタンIDがあることに注意してください。ボタン名が絵記号に追加された後に編集された場合、アクティビティはボタンを参照してその名前を知ることができるため、レポートに絵記号ごとおよびボタンごとにすべてのアクティビティがリストされている場合、ボタン名は変更されますアクティビティの説明に自動的に反映されます。
他のいくつかのアイデアと、それらのアイデアがプログラミング作業、データの整合性、パフォーマンス、およびレポートの柔軟性の間でどのように妥協するかを探します。