1

在我的数据库设计中,我使用触发器跟踪历史记录。首先,我有一个Goods包含以下列的基表:

Tablename: Goods
COLUMN1PK: GoodID
COLUMN2: ArticleCode
COLUMN3: Amount

我想跟踪对商品所做的所有操作,例如插入、删除或替换(不一定是列的更改值)。可以插入、更新、删除或替换商品。例如,GoodID 1已达到其生命周期并被GoodID 2. 为了能够捕获此信息,除了在历史表中引用表中的第二列之外,我看不到任何其他GoodID选项Goods

我的历史表将是:

Tablename: GoodsHistory
COLUMN1PK: GoodHistoryID
COLUMN2: ChangedBy
COLUMN3: DateChanged
COLUMN4: ActionType (like inserted, updated, replaced or deleted)
COLUMN5FK: GoodID (capture any insert/update/'fake'-delete operation)
COLUMN6FK: ReplacedByGoodID (capture the `GoodID` that is the replaced `GoodID`)

有关历史数据的示例,请参阅此记录集:

COLUMN1PK:  |  1          |  2           |  3           |  4
COLUMN2:    |  User1      |  User1       |  User1       |  User2
COLUMN3:    |  10/12/2012 |  12/16/2014  |  12/16/2014  |  12/16/2014
COLUMN4:    |  Inserted   |  Inserted    |  Replaced    |  Inserted
COLUMN5FK:  |  1          |  2           |  1           |  3
COLUMN6FK:  |  NULL       |  NULL        |  2           |  NULL

简短说明:GoodID 1自 2 年以来存在,今天User1创建了一个新的GoodID并用新的替换了旧的。此外,aUser2创建了一个新的GoodID 3.

我在 SQL Server 2008 R2 中工作,而 SQL 不喜欢多个级联路径。级联路径存在是因为COLUMN5FKCOLUMN6FK都指GoodID. 两个关系中只有一个允许Cascade另一个关系强制执行操作,如果两者都设置No actionUpdate/Delete则导致不可删除的货物。FK-relationships(所以在这种情况下,我不能更新/删除GoodID 12。)

解决方法将是一个触发器。由于我有几个具有相同设置的表,这将需要我为每个以相同方式跟踪历史的表创建/编辑触发器,并且我担心额外的开销以及管理数据库架构更改时的问题。

所以我的问题实际上是,对于这种信息收集是否还有其他更智能的设计/解决方案,或者由于 SQL Server 的限制,我是否应该坚持使用这个。

4

1 回答 1

1

恕我直言,您需要的历史不止一张表,First 将为您的商品保留记录,而主表将有参考。例如

GoodsActions {Id, GoodId, Action} 
GoodsHistory {UserId, GoodsActionsId, SetId} 

其中 SetId 将为逻辑操作聚合单个历史记录条目。

于 2014-12-16T09:17:24.833 回答