【问题标题】:Creating a table specifically for tracking change information to remove duplicated columns from tables创建专门用于跟踪更改信息的表以从表中删除重复的列
【发布时间】:2013-07-25 19:18:36
【问题描述】:

在创建表时,我通常使用几个额外的列来跟踪更改时间和相应的用户:

CREATE TABLE dbo.Object
    (
    ObjectId        int         NOT NULL IDENTITY (1, 1),
    ObjectName      varchar(50) NULL    ,
    CreateTime      datetime    NOT NULL,
    CreateUserId    int         NOT NULL,
    ModifyTime      datetime    NULL    ,
    ModifyUserId    int         NULL    
    )  ON [PRIMARY]
GO

我现在有一个新项目,如果我继续使用这种结构,我将在每个表上增加 6 个列,并使用这种类型的更改跟踪。时间列、用户 ID 列和地理列。我现在认为向我想要执行此操作的每个表添加 6 列是没有意义的。我想知道以下结构是否更有意义:

CREATE TABLE dbo.Object
    (
    ObjectId        int         NOT NULL IDENTITY (1, 1),
    ObjectName      varchar(50) NULL    ,
    CreateChangeId  int         NOT NULL,
    ModifyChangeId  int         NULL    
    )  ON [PRIMARY]
GO

-- foreign key relationships on CreateChangeId & ModifyChangeId

CREATE TABLE dbo.Change
    (
    ChangeId            int         NOT NULL IDENTITY (1, 1),
    ChangeTime          datetime    NOT NULL,
    ChangeUserId        int         NOT NULL,
    ChangeCoordinates   geography   NULL
    )  ON [PRIMARY]
GO

谁能提供一些关于这个小的数据库设计问题的见解,例如常见做法和功能设计?

【问题讨论】:

    标签: sql sql-server sql-server-2005 database-design


    【解决方案1】:

    在我工作的地方,我们使用与您相同的结构 - 每个表都有以下字段:

    CreatedBy (int, not null, FK users table - user id)
    CreationDate (datetime, not null)
    ChangedBy (int, null, FK users table - user id)
    ChangeDate (datetime, null)
    
    • Pro:易于跟踪和维护;只有一个 I/O 操作(我稍后会谈到)
    • 缺点:我现在想不出来(好吧,有时我们不使用更改字段 ;-)

    IMO 使用额外表的方法存在问题,您必须以某种方式还引用每条记录的所属表(除非您只需要单向对象到跟踪表)。该方法还导致更多的 I/O 数据库操作 - 对于每个 insertmodify 您将需要:

    • 向表对象添加条目
    • 向跟踪表添加条目并获取新 ID
    • 使用跟踪表 ID 更新对象表条目

    这肯定会使与数据库通信的应用程序代码更加复杂和容易出错。

    【讨论】:

      猜你喜欢
      • 2021-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-29
      • 2013-09-12
      • 1970-01-01
      • 1970-01-01
      • 2013-12-21
      相关资源
      最近更新 更多