Quelqu'un peut-il expliquer comment implémenter des relations un-à-un, un-à-plusieurs et plusieurs-à-plusieurs lors de la conception de tableaux avec quelques exemples?
Quelqu'un peut-il expliquer comment implémenter des relations un-à-un, un-à-plusieurs et plusieurs-à-plusieurs lors de la conception de tableaux avec quelques exemples?
Réponses:
Un à un: utilisez une clé étrangère pour la table référencée:
student: student_id, first_name, last_name, address_id
address: address_id, address, city, zipcode, student_id # you can have a
# "link back" if you need
Vous devez également placer une contrainte unique sur la colonne de clé étrangère ( addess.student_id
) pour empêcher que plusieurs lignes de la table enfant ( address
) ne soient liées à la même ligne de la table référencée ( student
).
Un-à-plusieurs : utilisez une clé étrangère du côté plusieurs de la relation qui renvoie au côté "un":
teachers: teacher_id, first_name, last_name # the "one" side
classes: class_id, class_name, teacher_id # the "many" side
Plusieurs à plusieurs : utilisez une table de jonction ( exemple ):
student: student_id, first_name, last_name
classes: class_id, name, teacher_id
student_classes: class_id, student_id # the junction table
Exemples de requêtes:
-- Getting all students for a class:
SELECT s.student_id, last_name
FROM student_classes sc
INNER JOIN students s ON s.student_id = sc.student_id
WHERE sc.class_id = X
-- Getting all classes for a student:
SELECT c.class_id, name
FROM student_classes sc
INNER JOIN classes c ON c.class_id = sc.class_id
WHERE sc.student_id = Y
student
donné address
.
student_classes
ligne ne doit avoir qu'une seule relation un à un. Si studentA
est dans classA
et classB
, alors il devrait y avoir deux lignes student_classes
, une pour quelle relation.
Voici quelques exemples concrets des types de relations:
Une relation est biunivoque si et seulement si un enregistrement du tableau A est lié à un maximum d'un enregistrement dans le tableau B.
Pour établir une relation un-à-un, la clé primaire de la table B (sans enregistrement orphelin) doit être la clé secondaire de la table A (avec enregistrements orphelins).
Par exemple:
CREATE TABLE Gov(
GID number(6) PRIMARY KEY,
Name varchar2(25),
Address varchar2(30),
TermBegin date,
TermEnd date
);
CREATE TABLE State(
SID number(3) PRIMARY KEY,
StateName varchar2(15),
Population number(10),
SGID Number(4) REFERENCES Gov(GID),
CONSTRAINT GOV_SDID UNIQUE (SGID)
);
INSERT INTO gov(GID, Name, Address, TermBegin)
values(110, 'Bob', '123 Any St', '1-Jan-2009');
INSERT INTO STATE values(111, 'Virginia', 2000000, 110);
Une relation est un-à-plusieurs si et seulement si un enregistrement du tableau A est lié à un ou plusieurs enregistrements du tableau B. Cependant, un enregistrement du tableau B ne peut pas être lié à plusieurs enregistrements du tableau A.
Pour établir une relation un-à-plusieurs, la clé primaire de la table A (la table "un") doit être la clé secondaire de la table B (la table "plusieurs").
Par exemple:
CREATE TABLE Vendor(
VendorNumber number(4) PRIMARY KEY,
Name varchar2(20),
Address varchar2(20),
City varchar2(15),
Street varchar2(2),
ZipCode varchar2(10),
Contact varchar2(16),
PhoneNumber varchar2(12),
Status varchar2(8),
StampDate date
);
CREATE TABLE Inventory(
Item varchar2(6) PRIMARY KEY,
Description varchar2(30),
CurrentQuantity number(4) NOT NULL,
VendorNumber number(2) REFERENCES Vendor(VendorNumber),
ReorderQuantity number(3) NOT NULL
);
Une relation est plusieurs-à-plusieurs si et seulement si un enregistrement de la table A est lié à un ou plusieurs enregistrements de la table B et vice versa.
Pour établir une relation plusieurs-à-plusieurs, créez une troisième table appelée "ClassStudentRelation" qui aura les clés primaires de la table A et de la table B.
CREATE TABLE Class(
ClassID varchar2(10) PRIMARY KEY,
Title varchar2(30),
Instructor varchar2(30),
Day varchar2(15),
Time varchar2(10)
);
CREATE TABLE Student(
StudentID varchar2(15) PRIMARY KEY,
Name varchar2(35),
Major varchar2(35),
ClassYear varchar2(10),
Status varchar2(10)
);
CREATE TABLE ClassStudentRelation(
StudentID varchar2(15) NOT NULL,
ClassID varchar2(14) NOT NULL,
FOREIGN KEY (StudentID) REFERENCES Student(StudentID),
FOREIGN KEY (ClassID) REFERENCES Class(ClassID),
UNIQUE (StudentID, ClassID)
);
C'est une question très courante, j'ai donc décidé de transformer cette réponse en un article .
La relation de table un-à-plusieurs se présente comme suit:
Dans un système de base de données relationnelle, une relation de table un-à-plusieurs relie deux tables en fonction d'une Foreign Key
colonne dans l'enfant qui fait référence à la ligne Primary Key
de la table parent.
Dans le diagramme de tableau ci-dessus, la post_id
colonne du post_comment
tableau a une Foreign Key
relation avec la colonne post
id de la table Primary Key
:
ALTER TABLE
post_comment
ADD CONSTRAINT
fk_post_comment_post_id
FOREIGN KEY (post_id) REFERENCES post
La relation de table un-à-un se présente comme suit:
Dans un système de base de données relationnelle, une relation de table un-à-un relie deux tables en fonction d'une Primary Key
colonne dans l'enfant qui fait également Foreign Key
référence à la ligne Primary Key
de la table parent.
Par conséquent, nous pouvons dire que la table enfant partage la Primary Key
avec la table parent.
Dans le diagramme de tableau ci-dessus, la id
colonne du post_details
tableau a également une Foreign Key
relation avec la colonne du post
tableau id
Primary Key
:
ALTER TABLE
post_details
ADD CONSTRAINT
fk_post_details_id
FOREIGN KEY (id) REFERENCES post
La relation table plusieurs à plusieurs se présente comme suit:
Dans un système de base de données relationnelle, une relation table plusieurs-à-plusieurs relie deux tables parent via une table enfant qui contient deux Foreign Key
colonnes référençant les Primary Key
colonnes des deux tables parent.
Dans le diagramme de tableau ci-dessus, la post_id
colonne du post_tag
tableau a également une Foreign Key
relation avec la colonne post
id de la table Primary Key
:
ALTER TABLE
post_tag
ADD CONSTRAINT
fk_post_tag_post_id
FOREIGN KEY (post_id) REFERENCES post
Et, la tag_id
colonne de la post_tag
table a une Foreign Key
relation avec la colonne tag
id de la table Primary Key
:
ALTER TABLE
post_tag
ADD CONSTRAINT
fk_post_tag_tag_id
FOREIGN KEY (tag_id) REFERENCES tag
Relation un à un (1-1): Il s'agit de la relation entre la clé primaire et la clé étrangère (la clé primaire relative à la clé étrangère un seul enregistrement). c'est une relation un à un.
Relation un à plusieurs (1-M): Il s'agit également d'une relation entre les relations de clés primaires et étrangères, mais ici, la clé primaire se rapporte à plusieurs enregistrements (par exemple, le tableau A contient des informations sur le livre et le tableau B a plusieurs éditeurs d'un livre).
Plusieurs à plusieurs (MM): plusieurs à plusieurs comprennent deux dimensions, expliquées en détail ci-dessous avec l'exemple.
-- This table will hold our phone calls.
CREATE TABLE dbo.PhoneCalls
(
ID INT IDENTITY(1, 1) NOT NULL,
CallTime DATETIME NOT NULL DEFAULT GETDATE(),
CallerPhoneNumber CHAR(10) NOT NULL
)
-- This table will hold our "tickets" (or cases).
CREATE TABLE dbo.Tickets
(
ID INT IDENTITY(1, 1) NOT NULL,
CreatedTime DATETIME NOT NULL DEFAULT GETDATE(),
Subject VARCHAR(250) NOT NULL,
Notes VARCHAR(8000) NOT NULL,
Completed BIT NOT NULL DEFAULT 0
)
-- This table will link a phone call with a ticket.
CREATE TABLE dbo.PhoneCalls_Tickets
(
PhoneCallID INT NOT NULL,
TicketID INT NOT NULL
)