考虑下面的表T
和U
。 T
是数据表,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
答案 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添加非聚集索引或覆盖索引提供了更好的性能。