我有一个表 X,它有一个自动递增的 ID 列作为它的主键。我还有其他表 A、B、C 和 D 来补充表 X 中的信息。每个表都必须包含一个引用表 X 中 ID 的列。我已经做到了,并且在我的代码(Java)中我有一个将每个条目的 ID 返回到表 X 并在插入其他表时使用它的方法。一切运作良好。
现在,有人建议我将表 A、B、C 和 D 上的那些 ID 列分配为 FOREIGN KEYS,因为“这是正确的做法”。我这样做了。现在从表 X 中删除行需要花费大量时间才能完成。插入其他表也需要更长的时间。
请不要误会我的意思,我知道为什么外键与指定数据库上的表关系有关。但它开始看起来只是仪式性的,而不是实际相关的,尤其是当我的交易变得越来越慢时。
问题:
1. 为了保持官方规定的关系而失去一些表现是否值得,即使这不是必要的?
2. 有什么方法可以加快我的交易速度,同时保持 FOREIGN KEY 规范。
谢谢。
回复
以下是表的创建方式。
创建表 SQL:
CREATE TABLE [dbo].[MainTableX](
[col1] [smalldatetime] ,
[col2] [varchar] (20) ,
[ID] [int] IDENTITY(1,1) NOT NULL,
CONSTRAINT [PK_MainTableX] PRIMARY KEY CLUSTERED
(
[ID] ASC
)
)
GO
CREATE TABLE [dbo].[RelatedTableA](
[differentID] [varchar] (50),
[detail1] [varchar] (40),
[detail2] [varchar] (40),
CONSTRAINT [PK_RelatedTableA] PRIMARY KEY CLUSTERED
(
[differentID] ASC
)
GO
-- Tables B, C D are pretty much similar to table A
添加外键 SQL:
ALTER TABLE RelatedTableA ADD ID INT
CONSTRAINT fk_refTableX_A FOREIGN KEY (ID)
REFERENCES MainTableX(ID)
GO
-- Same thing with the other related tables
解决方案
我将外键列设为索引。现在我的查询又快了。
Create nonclustered index IX_RelatedTableA
on RelatedTableA (ID)
GO