2013-04-29 4 views
0

Je suis un peu confus lorsque je devrais utiliser une clé primaire ou étrangère. J'ai deux tables, et dans les deux, certaines colonnes font référence à des colonnes qui sont des clés primaires dans d'autres tables. Ici, ils sont:Oracle Clés étrangères ou primaires

CREATE TABLE roles (
movie_id NUMBER(10,0) NOT NULL REFERENCES movies(movie_id), 
actor_id NUMBER(10,0) NOT NULL REFERENCES actors(actor_id), 
movie_description VARCHAR2(50), 
salary NUMBER(10), 
CONSTRAINT pk_roles PRIMARY KEY (movie_id, actor_id) 
); 

CREATE TABLE profits (
movie_id NUMBER(10,0) NOT NULL, 
gross_profit NUMBER(9) NOT NULL, 
net_profit NUMBER(9) NOT NULL, 
CONSTRAINT fk_profits FOREIGN KEY (movie_id) REFERENCES movies(movie_id) ON DELETE CASCADE 
); 

Dans le premier tableau, j'ai fait une clé primaire composite à partir teh deux colonnes qui font référence à des colonnes dans les autres tableaux. Ces colonnes sont des clés primaires dans leurs tables respectives.

Dans la deuxième table, j'ai fait à nouveau une clé étrangère référençant une clé primaire dans une autre table. Mais quelle est la meilleure pratique? Est-ce que la clé de la première table doit aussi être une clé étrangère puisqu'elle fait référence à des clés primaires dans d'autres tables?

Répondre

1

Les contraintes de clé primaire et les contraintes uniques empêchent les lignes dupliquées. Les lignes en double ne gaspillent pas seulement de l'espace, elles rendent plus difficile l'obtention de réponses significatives à partir de votre base de données.

Les contraintes de clé étrangère limitent les valeurs à celles qui existent dans une autre table. La cible d'une contrainte de clé étrangère est généralement une clé primaire, mais il peut s'agir de n'importe quelle colonne ayant une contrainte unique.

Chaque table doit avoir une contrainte de clé primaire. Si la ou les colonnes constituant la clé primaire nécessitent également une contrainte de clé étrangère, ajoutez également la contrainte de clé étrangère.

Votre table "rôles" est correcte, en ce qui concerne l'implémentation des contraintes de clé primaire et des contraintes de clé étrangère. Mais "profits" a besoin d'une clé primaire.

+0

Les contraintes de clé étrangère s'ajoutent donc aux contraintes de clé primaire et restreignent les valeurs à celles trouvées dans les colonnes étrangères? Est-ce que cela rend les instructions "... REFERENCES ..." dans des "rôles" alors, puisque je ne crée pas de clé étrangère là-bas? – Amoeba

+1

Vous créez deux contraintes de clé étrangère dans les "rôles". Dans 'movie_id ... REFERENCES movies (movie_id)', vous avez besoin que le film existe avant de stocker des informations sur les rôles joués par les acteurs dans ce film. Dans 'actor_id ... REFERENCES actors (actor_id)', vous avez besoin que l'acteur existe avant de stocker des informations sur les films dans lesquels l'acteur a joué. Ces deux contraintes de clé étrangère sont parfaitement sensées. –

+0

Quelle serait la différence entre comment j'ai la table des profits ci-dessus et faire 'movie_id NUMBER (10,0) NOT NULL REFERENCES films (movie_id)' et une contrainte comme 'CONSTRAINT pk_profits PRIMARY KEY (movie_id)'? – Amoeba

Questions connexes