5.9. Exemple complet#

Créer une table Livre et une table Thème avec les données suivantes :

Titre

NomAuteur

PrenomAuteur

AnneeNaissance

Langue

AnneePubli

Themes

1984

Orwell

George

1903

Anglais

1949

Totalitarisme, science-fiction, anticipation, Dystopie

Dune

Herbert

Frank

1920

Anglais

1965

science-fiction, anticipation

Fondation

Asimov

Isaac

1920

Anglais

1951

science-fiction, Economie

Le meilleur des mondes

Huxley

Aldous

1894

Anglais

1931

Totalitarisme, science fiction, dystopie

Fahrenheit 451

Bradbury

Ray

1920

Anglais

1953

science-fiction, Dystopie

Ubik

K. Dick

Philip

1928

Anglais

1969

science-fiction, anticipation

Chroniques martiennes

Bradbury

Ray

1920

Anglais

1950

science-fiction, anticipation

La nuit des temps

Barjavel

René

1911

Français

1968

science-fiction, tragédie

Blade Runner

K. Dick

Philip

1928

Anglais

1968

Intelligence artificielle, science fiction

Les Robots

Asimov

Isaac

1920

Anglais

1950

science fiction, Intelligence artificielle

La Planète des singes

Boulle

Pierre

1912

Français

1963

science fiction, Dystopie

Ravage

Barjavel

René

1911

Français

1943

Science-Fiction, anticipation

Le Maître du Haut Château

K. Dick

Philip

1928

Anglais

1962

Dystopie, Uchronie

Le monde des A

Van Vogt

Alfred Elton

1912

Anglais

1945

science fiction, IA

La Fin de l’éternité

Asimov

Isaac

1920

Anglais

1955

science-fiction, voyage dans le temps

De la Terre à la Lune

Verne

Jules

1828

Français

1865

Science-Fiction, aventure

La table livre comporte un IdLivre (clef primaire sur la table), un TitreOuvrage, une référence à IdAuteur et une AnneePubli.

%%sql 
CREATE TABLE Livres (
    IdLivre       INTEGER  PRIMARY KEY,
    TitreOuvrage      TEXT,
    IdAuteur       INTEGER,
    AnneePubli INTEGER,
    FOREIGN KEY(IdAuteur) REFERENCES Auteurs(IdAuteur)
);
 * sqlite:///livres.sqlite
Done.
[]
%%sql
INSERT INTO Livres (TitreOuvrage, IdAuteur, AnneePubli) VALUES
("1984",1,1949),
("Dune",2,1965),
("Fondation",3,1951),
("Le meilleur des mondes",4,1931)
 * sqlite:///livres.sqlite
4 rows affected.
[]

5.9.1. Les thèmes#

%%sql
CREATE TABLE Themes (
    IdTheme INTEGER PRIMARY KEY,
    Theme TEXT
);
 * sqlite:///livres.sqlite
Done.
[]
%%sql
INSERT INTO Themes (Theme) VALUES
("Science-Fiction"),
("Totalitarisme"),
("Anticipation"),
("Dystopie"),
("Intelligence artificielle"),
("Utopie"),
("Voyage dans le temps"),
("Économie") ;
 * sqlite:///livres.sqlite
8 rows affected.
[]

5.9.2. Relation entre ouvrages et thèmes#

Une table dédié pour cette relation

%%sql
CREATE TABLE RelationLivreThemes (
    IdRelation INTEGER PRIMARY KEY,
    IdLivre INTEGER,
    IdTheme INTEGER,
    FOREIGN KEY (IdLivre) REFERENCES Livres(IdLivre),
    FOREIGN KEY (IdTheme) REFERENCES Themes(IdTheme)
) ;
INSERT INTO RelationLivreThemes (IdLivre,IdTheme)
VALUES (1,1),(1,2),(1,3),(1,4) ;
 * sqlite:///livres.sqlite
Done.
4 rows affected.
[]

5.9.3. Cardinalité#

Les relations entre les premières tables étaient de types \(1-n\), c’est à dire qu’à un auteur correspondait une langue par exemple (mais qu’une langue était parlée/écrite chez plusieurs auteurs)

La nouvelle relation entre ouvrages et thèmes est \(n-n\)

Pour récupérer ces relations, il est nécesaaire de passer par une table externe.

%%sql
SELECT TitreOuvrage, Theme
FROM Livres
JOIN RelationLivreThemes
USING (IdLivre) JOIN Themes USING (IdTheme)
 * sqlite:///livres.sqlite
Done.
TitreOuvrage Theme
1984 Science-Fiction
1984 Totalitarisme
1984 Anticipation
1984 Dystopie