SQL Server 2005外键和索引

时间:2010-12-14 22:36:16

标签: sql-server-2005 database-design

我对数据库建模中的外键表索引有一般性的疑问。如果我有一个表TABLE_A,则创建为:

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])

和Table_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]

如果我在引用表(表A)引用列(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 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

没有。你要找的是第三张桌子。如果你想建立一个多对多的关系,那么没有第三张桌子就不可能没有令人作呕的低效数据库设计。

因此: 表'用户':uid,first,middle,last 表'地址':援助,街道,城市,州,国家等 表'users-addresses':id,uid,aid

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

那么您的查询关联查询将类似于:

SELECT * FROM users,addresses JOIN users-addresses ON users.uid = users-addresses.uid AND addresses.aid = users-addresses.aid WHERE users.uid ='1'或类似的东西

..将为您提供用户'1'的所有用户信息和地址