2010-12-14 75 views
0

我有一个关于数据库建模中外键表索引的常见问题。如果我有一个表,TABLE_A,创建为:SQL Server 2005外键和索引

CREATE TABLE [dbo].[TABLE_A](
[ID] [int] IDENTITY(1,1) NOT NULL, 
    [RelatedTableBID] [int] NOT NULL, 
    CONSTRAINT [PK__TABLE_A] PRIMARY KEY CLUSTERED 
    (
     [ID] ASC 
    ) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, 
    IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) 
    ON [PRIMARY] 
) ON [PRIMARY] 

ALTER TABLE [dbo].[TABLE_A] WITH CHECK 
ADD CONSTRAINT [TABLE_A__RelatedTableB]  
FOREIGN KEY([RelatedTableBID]) 
REFERENCES [dbo].[TABLE_B] ([ID]) 

和表-B为:

CREATE TABLE [dbo].[TABLE_B](
[ID] [int] IDENTITY(1,1) NOT NULL, 
    CONSTRAINT [PK__TABLE_B] PRIMARY KEY CLUSTERED 
    (
     [ID] ASC 
    ) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, 
    IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) 
    ON [PRIMARY] 
) ON [PRIMARY] 

它实际上将更加有效,如果我创建在引用表的索引(表一)引用列(RelatedTableBID)?如在:

CREATE INDEX TABLE_A_FK_INDEX1 on TABLE_A(RelatedTableBID) 

还是我在想这个倒退?看起来,由于被引用的列本身就是一个聚集索引,所以在连接期间不应该有任何问题 - 如果有的话,只从TABLE_B删除似乎容易受到糟糕的性能影响。

感谢您的任何帮助,让我挺身而出。

-Mustafa

编辑
因此,在一般情况下,如果我曾经参加上或使用列在where子句一致查询的时候,我应该考虑增加它的指数? What are some best practices and "rules of thumb" for creating database indexes?听起来像这是一个普遍合理的决定。

回答

2

你说得对。无论何时需要加入TABLE_A和TABLE_B,外键上的索引都应该有所帮助。

0

不需要。您要查找的是第三张表格。如果这是一个多对多的关系,那么你不打算在没有第三个表的情况下做一个令人厌恶的低效DB设计。

这样: 表 '用户':UID,第一,中间,最后 表 '地址':援助,街道,城市,州,国家等 表 '用户 - 地址':ID,UID,援助

然后,您可以在第三个表中创建多个到多个关联。这通常称为数据库规范化。

所以,然后将查询关联的查询看起来是这样的:

SELECT * FROM用户,地址加入关于users.uid =用户-addresses.uid和addresses.aid =用户-addresses.aid,用户-地址users.uid =“1”或类似的东西

..would给你用户的所有用户信息和地址“1”

+0

不知道你的意思是这样的一个问题 - 我认为乔·斯特凡内利有我设置直接。 – Mustafakidd 2010-12-14 23:35:04