Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[HS] Schéma de base: table A *ou* table B

2 réponses
Avatar
myname
Bonjour,

désolé d'être "hors sujet", mais je me pose une question
sur mon schéma de base.

Imaginons une base de médiathèque, avec une table
Livre et une table Cassette.

Pour chaque emprunt d'un élément, je remplis une
table Emprunt (pointant vers Membre, etc...)

Mais comment relier un Emprunt à un Livre *ou* une Cassette ?

Je vois deux solutions:

1) ajouter à Emprunt un champ "Type" (Livre/Cassette) puis un champ
clé externe pointant vers une des deux tables selon le cas.

2) créer dans Emprunt un champ pour Livre *et* un champ pour Cassette,
l'un des deux étant toujours "null".

Je trouve ces deux méthodes très moches, et pas très "formes normales".
Et je frémis à l'idée de la tête des requêtes...

Y a-t-il une solution plus élégante ?

Merci !

myname

2 réponses

Avatar
Patrice
Quelle est la différence entre un livre et une cassette pour ce qui est des
attributs ?

Une autre solution est d'avoir une table "Item" qui stocke n'importe quel
item pouvant être emprunté. Le lien se fait alors avec cette table.
Eventuellement un type permet de savoir de quoi il s'agit et de récupérer
les attributs spécifiques à un livre ou une cassette dans la table
spécifique correspondante...

Cf par exemple :
http://sqlpro.developpez.com/cours/modelisation/heritage/

-
Patrice

"myname" a écrit dans le message de groupe de
discussion : 492b1cb9$0$906$
Bonjour,

désolé d'être "hors sujet", mais je me pose une question
sur mon schéma de base.

Imaginons une base de médiathèque, avec une table
Livre et une table Cassette.

Pour chaque emprunt d'un élément, je remplis une
table Emprunt (pointant vers Membre, etc...)

Mais comment relier un Emprunt à un Livre *ou* une Cassette ?

Je vois deux solutions:

1) ajouter à Emprunt un champ "Type" (Livre/Cassette) puis un champ
clé externe pointant vers une des deux tables selon le cas.

2) créer dans Emprunt un champ pour Livre *et* un champ pour Cassette,
l'un des deux étant toujours "null".

Je trouve ces deux méthodes très moches, et pas très "formes normales".
Et je frémis à l'idée de la tête des requêtes...

Y a-t-il une solution plus élégante ?

Merci !

myname






Avatar
Fred BROUARD
En sus de la modélisation par héritage pensez que vous n'empruntez pas
l'œuvre mais l'ouvrage. Autrement dit il faut une notion d'exemplaire.
Une personne emprunte un ouvrage (ou exemplaire) qui contient une oeuvre
(ou d'ailleurs plusieurs : par exemple florilège de contes).

A +


myname a écrit :
Bonjour,

désolé d'être "hors sujet", mais je me pose une question
sur mon schéma de base.

Imaginons une base de médiathèque, avec une table
Livre et une table Cassette.

Pour chaque emprunt d'un élément, je remplis une
table Emprunt (pointant vers Membre, etc...)

Mais comment relier un Emprunt à un Livre *ou* une Cassette ?

Je vois deux solutions:

1) ajouter à Emprunt un champ "Type" (Livre/Cassette) puis un champ
clé externe pointant vers une des deux tables selon le cas.

2) créer dans Emprunt un champ pour Livre *et* un champ pour Cassette,
l'un des deux étant toujours "null".

Je trouve ces deux méthodes très moches, et pas très "formes normales".
Et je frémis à l'idée de la tête des requêtes...

Y a-t-il une solution plus élégante ?

Merci !

myname








--
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
*********************** http://www.sqlspot.com *************************