SQL Server 2005: FK en PK ou un PK propre à la table!

Le
EmanuelL
Bonjour à Tous,

Encore moi. J'ai besoin de vos avis:
J'ai crée une table (associative) avec 2 identifiants qui sont en
faites des cléfs étrangères et j'ai transformé ces mêmes cléfs en clés
primaires, voir codes ci-dessous.

Est-elle une bonne manière de faire ou le mieux est de laisser ces 2
cléfs en clé étrangère et d'ajouter un nouveau identifiant comme cléf
primaire?

Merci d'avance. ;-)


-- Table Client_Mandat (CLMA)
CREATE TABLE [FiducDB2].[dbo].[Client_Mandat](
[Client_ID] [decimal](10,0) NOT NULL,
[Mandat_ID_Ligne] [varchar](10) NOT NULL,
CONSTRAINT [PK_Client_ID_Mandat_ID_Ligne]
PRIMARY KEY CLUSTERED([Client_ID], [Mandat_ID_Ligne])
)
GO

-- CLMA - Colonne Client_ID
ALTER TABLE [FiducDB2].[dbo].[Client_Mandat]
WITH CHECK ADD CONSTRAINT [FK_Client_Client_ID_CLMA]
FOREIGN KEY([Client_ID])
REFERENCES [FiducDB2].[dbo].[Client] ([Client_ID]);
GO
ALTER TABLE [FiducDB2].[dbo].[Client_Mandat]
CHECK CONSTRAINT [FK_Client_Client_ID_CLMA];
GO

-- CLMA - Colonne Mandat_ID_Ligne
ALTER TABLE [FiducDB2].[dbo].[Client_Mandat]
WITH CHECK ADD CONSTRAINT [FK_Mandat_Mandat_ID_Ligne]
FOREIGN KEY([Mandat_ID_Ligne])
REFERENCES [FiducDB2].[dbo].[Mandat] ([Mandat_ID_Ligne]);
GO
ALTER TABLE [FiducDB2].[dbo].[Client_Mandat]
CHECK CONSTRAINT [FK_Mandat_Mandat_ID_Ligne];
GO

--

*!* --
EmanuelL
Membre d'AtoutFox
www.atoutfox.org
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Fred BROUARD
Le #19256911
Cela dépend, mais avec une clef p^primaire composée de deux colonnes,
les performances devrait être meilleure qu'en rajoutant une clef
artificielle.

A trois en revanche, c'est le contraire...

A ++

EmanuelL a écrit :
Bonjour à Tous,

Encore moi. J'ai besoin de vos avis:
J'ai crée une table (associative) avec 2 identifiants qui sont en faites
des cléfs étrangères et j'ai transformé ces mêmes cléfs en clés
primaires, voir codes ci-dessous.

Est-elle une bonne manière de faire ou le mieux est de laisser ces 2
cléfs en clé étrangère et d'ajouter un nouveau identifiant comme cléf
primaire?

Merci d'avance. ;-)


-- Table Client_Mandat (CLMA) ------------------------------------
CREATE TABLE [FiducDB2].[dbo].[Client_Mandat](
[Client_ID] [decimal](10,0) NOT NULL,
[Mandat_ID_Ligne] [varchar](10) NOT NULL,
CONSTRAINT [PK_Client_ID_Mandat_ID_Ligne]
PRIMARY KEY CLUSTERED([Client_ID], [Mandat_ID_Ligne])
)
GO

-- CLMA - Colonne Client_ID ---------------
ALTER TABLE [FiducDB2].[dbo].[Client_Mandat]
WITH CHECK ADD CONSTRAINT [FK_Client_Client_ID_CLMA]
FOREIGN KEY([Client_ID])
REFERENCES [FiducDB2].[dbo].[Client] ([Client_ID]);
GO
ALTER TABLE [FiducDB2].[dbo].[Client_Mandat]
CHECK CONSTRAINT [FK_Client_Client_ID_CLMA];
GO

-- CLMA - Colonne Mandat_ID_Ligne ---------------
ALTER TABLE [FiducDB2].[dbo].[Client_Mandat]
WITH CHECK ADD CONSTRAINT [FK_Mandat_Mandat_ID_Ligne]
FOREIGN KEY([Mandat_ID_Ligne])
REFERENCES [FiducDB2].[dbo].[Mandat] ([Mandat_ID_Ligne]);
GO
ALTER TABLE [FiducDB2].[dbo].[Client_Mandat]
CHECK CONSTRAINT [FK_Mandat_Mandat_ID_Ligne];
GO





--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
Enseignant aux Arts & Métiers PACA et à L'ISEN Toulon - Var Technologies
*********************** http://www.sqlspot.com *************************
EmanuelL
Le #19258591
Merci beaucoup de m'avoir rassurer.

A+


Dans son message précédent, Fred BROUARD a écrit :
Cela dépend, mais avec une clef p^primaire composée de deux colonnes, les
performances devrait être meilleure qu'en rajoutant une clef artificielle.

A trois en revanche, c'est le contraire...

A ++

EmanuelL a écrit :
Bonjour à Tous,

Encore moi. J'ai besoin de vos avis:
J'ai crée une table (associative) avec 2 identifiants qui sont en faites
des cléfs étrangères et j'ai transformé ces mêmes cléfs en clés primaires,
voir codes ci-dessous.

Est-elle une bonne manière de faire ou le mieux est de laisser ces 2 cléfs
en clé étrangère et d'ajouter un nouveau identifiant comme cléf primaire?

Merci d'avance. ;-)


-- Table Client_Mandat (CLMA) ------------------------------------
CREATE TABLE [FiducDB2].[dbo].[Client_Mandat](
[Client_ID] [decimal](10,0) NOT NULL,
[Mandat_ID_Ligne] [varchar](10) NOT NULL,
CONSTRAINT [PK_Client_ID_Mandat_ID_Ligne]
PRIMARY KEY CLUSTERED([Client_ID], [Mandat_ID_Ligne])
)
GO

-- CLMA - Colonne Client_ID ---------------
ALTER TABLE [FiducDB2].[dbo].[Client_Mandat]
WITH CHECK ADD CONSTRAINT [FK_Client_Client_ID_CLMA]
FOREIGN KEY([Client_ID])
REFERENCES [FiducDB2].[dbo].[Client] ([Client_ID]);
GO
ALTER TABLE [FiducDB2].[dbo].[Client_Mandat]
CHECK CONSTRAINT [FK_Client_Client_ID_CLMA];
GO

-- CLMA - Colonne Mandat_ID_Ligne ---------------
ALTER TABLE [FiducDB2].[dbo].[Client_Mandat]
WITH CHECK ADD CONSTRAINT [FK_Mandat_Mandat_ID_Ligne]
FOREIGN KEY([Mandat_ID_Ligne])
REFERENCES [FiducDB2].[dbo].[Mandat] ([Mandat_ID_Ligne]);
GO
ALTER TABLE [FiducDB2].[dbo].[Client_Mandat]
CHECK CONSTRAINT [FK_Mandat_Mandat_ID_Ligne];
GO






--

*!* -----------------------------------
EmanuelL
Membre d'AtoutFox
www.atoutfox.org
WOLO Laurent
Le #19567701
Cela n'est bon que dans le cas d'une relation n:m pour tout autre cas, ce
n'est pas conseillé mais c'est passible dans le cadre de la dénormalisation.
"EmanuelL" news:
Bonjour à Tous,

Encore moi. J'ai besoin de vos avis:
J'ai crée une table (associative) avec 2 identifiants qui sont en faites
des cléfs étrangères et j'ai transformé ces mêmes cléfs en clés primaires,
voir codes ci-dessous.

Est-elle une bonne manière de faire ou le mieux est de laisser ces 2 cléfs
en clé étrangère et d'ajouter un nouveau identifiant comme cléf primaire?

Merci d'avance. ;-)


-- Table Client_Mandat (CLMA) ------------------------------------
CREATE TABLE [FiducDB2].[dbo].[Client_Mandat](
[Client_ID] [decimal](10,0) NOT NULL,
[Mandat_ID_Ligne] [varchar](10) NOT NULL,
CONSTRAINT [PK_Client_ID_Mandat_ID_Ligne]
PRIMARY KEY CLUSTERED([Client_ID], [Mandat_ID_Ligne])
)
GO

-- CLMA - Colonne Client_ID ---------------
ALTER TABLE [FiducDB2].[dbo].[Client_Mandat]
WITH CHECK ADD CONSTRAINT [FK_Client_Client_ID_CLMA]
FOREIGN KEY([Client_ID])
REFERENCES [FiducDB2].[dbo].[Client] ([Client_ID]);
GO
ALTER TABLE [FiducDB2].[dbo].[Client_Mandat]
CHECK CONSTRAINT [FK_Client_Client_ID_CLMA];
GO

-- CLMA - Colonne Mandat_ID_Ligne ---------------
ALTER TABLE [FiducDB2].[dbo].[Client_Mandat]
WITH CHECK ADD CONSTRAINT [FK_Mandat_Mandat_ID_Ligne]
FOREIGN KEY([Mandat_ID_Ligne])
REFERENCES [FiducDB2].[dbo].[Mandat] ([Mandat_ID_Ligne]);
GO
ALTER TABLE [FiducDB2].[dbo].[Client_Mandat]
CHECK CONSTRAINT [FK_Mandat_Mandat_ID_Ligne];
GO

--

*!* -----------------------------------
EmanuelL
Membre d'AtoutFox
www.atoutfox.org




Publicité
Poster une réponse
Anonyme