PK,唯一密钥和跟踪历史记录在同一表上

时间:2019-05-31 16:09:13

标签: sql-server database database-design

MY RDBMS是SQL Server 2017。

嗯,有很多问题。我了解历史记录跟踪表不应包含PK,否则跟踪历史记录将很困难或不可能-如果我错了,请更正我。

我有一个这样的数据库:

  • 主(idn,id,地址,开始日期,结束日期)
  • Main_Info(uid,id,info_type,值,开始日期,结束日期)

idnuid是标识列,它们没有相互连接。

Main表中,我有PK (idn, id)以及unique_key(id)和unique_key(id, start_date)[但是,第二个唯一键对我没有帮助,我了解原因]

Main_Info中,我有PK(uid)和FK(id),它们引用了Main(id)

我已经解释了实际的代码行。

如果仅在Main_Info表上跟踪历史记录,则没有问题。出现此问题是因为我需要跟踪Main表上[address]的任何更改的历史记录。

是否确实可以在此(主)表上跟踪历史记录?

这是我尝试按照上述设计将其他数据插入Main表中时收到的错误消息:

  

Msg 2627,第14级,状态1,第4行
  违反UNIQUE KEY约束

在尝试了一些不同的唯一键设计后,出现了以下错误消息:

  

信息1776,级别16,状态0
  被引用表中没有与外键中引用列列表匹配的主键或候选键

     

1750级16状态1消息
  无法创建约束或索引

Msg 1776是由于我在id, start_date表上具有Unique_key(Main)而引起的。因此,实质上,必须在Main_Info表中引用整个复合唯一键。这是我看到问题的严重程度的时候。

假设我的Main(id)= 122

这是我对数据库的期望的“示例”:

(在理想情况下,Main的PK将保持为群集PK)

主要{(1,122,100 Main St,1900/01/01,1905/01/01),(2,122,101 Main St,1905/01/01,1908/01/01),( 3,122,110 Main St,1908/01/01,1908/01/09),(4,122,111 Main St,1908/01/09,NULL),…}

以NULL作为end_date表示该记录仍然有效。

Main_Info {(1,122,'store_type','department store',1900/01/01,NULL),(2,122,'owner','someone',1900/01/01,NULL), …}

我只是在这里添加一些额外的信息,以说明如果我未对Main(id)设置唯一键约束,会发生什么情况:

  

1776年消息,级别16,状态0,   被引用表中没有与外键中引用列列表匹配的主键或候选键

     

1750消息,第16级,状态1,   无法创建约束或索引。

0 个答案:

没有答案