1

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

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

任何人都可以对这个小的数据库设计问题提供一些见解,例如常见做法和功能设计吗?

4

1 回答 1

2

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

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

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

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

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

于 2013-07-25T18:35:56.137 回答