Les SGBD relationnels possèdent un mécanisme, clés primaires et clés étrangères, permettant d'assurer l'intégrité des associations qui existent entre 2 tables.
PRIMARY KEY
par tableFOREIGN KEYS
Et d'organiser l'information
Identifie de façon UNIQUE et NOT NULL chaque enregistrement par la valeur d'une ou plusieurs colonnes
create or replace table teachers (
-- raccourci directement à la création de la colonne
-- primary est optionnel, mais on précise pour être explicite
employee_number int unsigned auto_increment primary key,
name varchar(200) not null
);
-- describe teachers; pour constater le not null ajouté automatiquement
create or replace table courses (
code char(10) not null,
name varchar(200) not null,
teacher_employee_number int unsigned,
semester char(5) not null,
-- définition dédiée, permet de nommer PLUSIEURS colonnes: CLÉ COMPOSITE
primary key (code, teacher_employee_number, semester)
);
Force un lien vers un enregistrement identifié par une PRIMARY KEY
create or replace table courses (
code char(10) not null,
name varchar(200) not null,
semester char(5) not null,
teacher_employee_number int unsigned, -- NOT NULL ???
-- le type des colonnes doit correspondre
foreign key (teacher_employee_number) references teachers (employee_number)
);
create or replace table grades (
student_da varchar(7),
grade smallint unsigned not null,
course_code char(10) not null,
course_teacher int unsigned not null,
course_semester char(5) not null,
primary key (student_da, course_code, course_teacher, course_semester),
foreign key (course_code, course_teacher, course_semester)
references courses(code, teacher_employee_number, semester)
-- , foreign key (student_da) references students(da) -- on peut définir PLUSIEURS FK
);
On peut préciser le comportement à implémenter lors de la modification de la PRIMARY KEY
ou suppression d'un enregistrement parent
CASCADE
L'action est propagée. Les enfants sont supprimés, la mise à jour de PRIMARY KEY
est répercutéeSET NULL
La valeur NULL est assignée à la FOREIGN KEY
FOREIGN KEY (col[, ...])
REFERENCES table_name (col[, ...])
[ON DELETE { RESTRICT | CASCADE | SET NULL }]
[ON UPDATE { RESTRICT | CASCADE | SET NULL }]
Une étape importante de conception d'une base de données relationnelle organisée est la normalisation
Une seule table Recipes
name | desc | ingr | steps | prep_time | category | cook_name | cook_email | cook_join_date |
a | ... | ... | ... | ... | ... | james | j@mail.ca | YYYY-MM-DD |
b | ... | ... | ... | ... | ... | james | j@mail.ca | YYYY-MM-DD |
c | ... | ... | ... | ... | ... | mathieu | m@mail.ca | YYYY-MM-DD |
d | ... | ... | ... | ... | ... | james | j@mail.ca | YYYY-MM-DD |
Devient 2 tables
Cooks
id | name | join_date | |
1 | james | j@mail.ca | YYYY-MM-DD |
2 | mathieu | m@mail.ca | YYYY-MM-DD |
Recipes
name | desc | ingr | steps | prep_time | category | cook_id |
a | ... | ... | ... | ... | ... | 1 |
b | ... | ... | ... | ... | ... | 1 |
c | ... | ... | ... | ... | ... | 2 |
d | ... | ... | ... | ... | ... | 1 |