对主键或聚簇索引使用1-1关系?

时间:2015-08-12 06:44:10

标签: sql-server sql-server-2014

考虑下面的表TUT是数据表,U是包含附加数据的表。因此,在TID处进行连接的一对一关系。在我的数据库中,表U的主键当前从未使用过。

问:考虑到性能,将表U替换为V(有效删除额外的主键)会更好吗?如果我为这些表添加覆盖索引会有所不同吗?

CREATE TABLE T (
    TID int IDENTITY(1,1) NOT NULL
 CONSTRAINT PK_T PRIMARY KEY CLUSTERED (TID ASC)
)
GO

CREATE TABLE U (
    UID int IDENTITY(1,1) NOT NULL,
    TID int NOT NULL CONSTRAINT FK_U_TID FOREIGN KEY REFERENCES T(TID)
 CONSTRAINT PK_U PRIMARY KEY CLUSTERED (UID ASC)
)
GO

CREATE UNIQUE NONCLUSTERED INDEX U_TID_Index ON U (TID ASC)
GO

CREATE TABLE V (
    TID int NOT NULL CONSTRAINT FK_V_TID FOREIGN KEY REFERENCES T(TID)
 CONSTRAINT PK_V PRIMARY KEY CLUSTERED (TID ASC)
)
GO

2 个答案:

答案 0 :(得分:2)

如果关联确实是1:1,那么拥有一个额外的主键是没有意义的 - 它所做的只是强迫你创建另一个索引,而且它甚至没有聚集。通过添加单独的主键,您可以有效地将表的大小加倍(可能,TID索引将覆盖整个表。)

添加另一个键/ id只有在关系不是1:1时才有意义 - 最明显的例子当然是1:n关系。但是,即使在这种情况下,您通常会在一对ID上创建主键和聚簇索引 - TID " uniquizer"。

当您需要使用"孩子时,完全独立的身份证是一个不错的选择。独立于父母 - 如果您通常通过其父母查询它,那么拥有单独的ID就没什么意义。

答案 1 :(得分:0)

试试这个,

CREATE TABLE T
  (
     TID INT IDENTITY(1, 1) NOT NULL
     CONSTRAINT PK_T PRIMARY KEY CLUSTERED (TID ASC)
  )

GO

CREATE TABLE V
  (
     TID INT NOT NULL CONSTRAINT FK_V_TID FOREIGN KEY REFERENCES T(TID)
     CONSTRAINT PK_V PRIMARY KEY CLUSTERED (TID ASC)
  )

GO 

您的第二张桌子根本不需要。您可以使用两个表table-1和table-3。

这种方法比向表-2添加非聚集索引或覆盖索引提供了更好的性能。