数据库设计用于记录跟踪

时间:2018-06-23 17:59:43

标签: entity-framework-core asp.net-core-2.0

背景:我正在编写一个应用程序,并使用efcore设计数据库。有一些特殊的表存储用户操作,我需要跟踪这些操作是谁创建了该记录,最后对其进行了修改以及将其删除(软删除)。

我有一个用户表,该表具有一个int作为PK,并且每个相应字段(CreatedBy,LastModifiedBy,DeletedBy)都拥有一个指向用户行的int。

我确实有完整的审核设置,其中整个行的旧/新内容都保存在存储中,并且工作正常。但是这个特殊的问题是关于通过跟踪更直接地创建/修改/删除的。

服务台通常是每天使用这些字段来帮助用户确定正在发生什么情况的人,但是应用程序本身中有很多地方最终将利用这些字段(此外,从应用程序角度创建/修改的地方)。

问题:我要在表和用户表之间创建pk / fk关系。但是,这让我开始思考是否有更好的策略,然后将这3个字段和关系添加到以后的每个表中。也许是一个存储表名称及其pk以及创建/修改/删除列的表,这些表具有与用户表的关系,因此只有1个表具有与用户表的pk / fk关系。我只是觉得必须有更好的方法/更有效的方法来处理此问题。有更好的方法来解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

不要按照自己的想法去做,请坚持原始设计-将所有与表本身相关的审计字段都保留在表中。添加一个存储其他表的审核字段的表只会造成设计梦night。

现在,一个更大的问题是如何跟踪审计交易。我喜欢的设计如下:

  • CreateBy。添加默认绑定SUBSTRING(SUSER_NAME(),1,50)
  • CreateTs。添加默认绑定GETDATE()
  • UpdateBy
  • UpdateTs

允许硬删除(即错误数据)。软删除以称为ActiveInd(BIT)的附加列的形式出现,该交易将在该列中存储为更新。这意味着更新和软删除记录在UpdateBy / UpdateTs列中。

如果您打算跟踪Web应用程序中的活动,那么应该可以满足您的需求。如果您有一个正在加载和处理数据的后端系统,那么我将包括一个跟踪所有作业的LoadInfo表,然后可以同时添加LoadSequenceKey和ParentSequenceKey(在此处添加自引用外键),然后可以在所有将序列键存储为CreateSequenceKey或UpdateSequenceKey的作业修改的表上创建外键。

根据我在StackOverflow的经验,这可能是您会获得最多考虑的最佳答案,无论是否决还是向您讲述我们如何解决特定的代码问题,而不是广泛的设计问题。

注意:我没有否决你的问题。