2010-12-14 56 views
0

J'ai une question générale concernant les index de table sur les clés étrangères dans la modélisation de base de données. Si j'ai une table, TABLE_A, créé comme:Clés et indicateurs étrangers 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]) 

et Table_B comme:

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] 

aura-t-il dans la pratique plus efficace si je crée un index sur la table de référence (tableau A) référence colonne (RelatedTableBID)? Comme dans:

CREATE INDEX TABLE_A_FK_INDEX1 on TABLE_A(RelatedTableBID) 

Ou est-ce que je pense à cela à l'envers? Il semble que puisque la colonne référencée est elle-même un index clusterisé, il ne devrait pas y avoir de problèmes lors des jointures - si ce n'est que les suppressions de TABLE_B semblent susceptibles de mauvaises performances.

Merci pour toute aide pour me mettre en ligne.

-Mustafa

EDIT
Donc, en général, si je suis toujours ou se joindre à l'aide d'une colonne dans une clause where cohérente lors de l'interrogation, dois-je ajouter un index sur elle? What are some best practices and "rules of thumb" for creating database indexes? On dirait que c'est une décision généralement saine.

Répondre

2

Vous avez raison. Cet index sur la clé étrangère devrait vous aider chaque fois que vous devez joindre TABLE_A et TABLE_B.

0

Non. Ce que vous cherchez est une troisième table. S'il s'agit d'une relation plusieurs-à-plusieurs que vous cherchez à construire, il n'est pas possible de se passer d'une conception de base de données dégoûtante et inefficace sans une troisième table.

Ainsi: Table 'utilisateurs': uid, premier, milieu, dernières 'adresses' Tableau: aide, rue, ville, état, pays, etc. 'utilisateurs-adresses' Tableau: id, uid, aide

Ensuite, vous pouvez créer plusieurs associations dans la troisième table. Ceci est généralement appelé normalisation de la base de données.

Alors votre requête associative de requête ressemblerait à quelque chose comme:

SELECT * FROM utilisateurs, adresses REJOIGNEZ utilisateurs-adresses sur users.uid = utilisateurs-addresses.uid ET addresses.aid = utilisateurs-addresses.aid OÙ users.uid = « 1 » ou quelque chose comme ça

..would vous donner toutes les informations utilisateur et adresses pour l'utilisateur « 1 »

+0

Je ne sais pas si vous vouliez dire cela pour une autre question - je pense que Joe Stefanelli m'a mis droit cependant. – Mustafakidd