2010-12-14 71 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