Vous décrivez le système en tant que système de gestion de documents. Une solution serait alors d'honorer la primauté de la nature documentée des entités dans le système. Le modèle suivant définit une entité abstraite qui sert de parent pour une table de documents et de super-type pour un ensemble de tables de sous-types. Ce modèle vous permet d'associer n'importe quel nombre de documents avec un DocumentedThing
.
DocumentedThing
---------------
ThingId Integer primary key
ThingType String check (ThingType in ('PUPIL', 'STAFF'))
unique key (ThingId, ThingType)
Document
--------
ThingId Integer foreign key references DocumentedThing (ThingId)
DocumentId Integer primary key
Text Clob
Pupil
-----
PupilId Integer primary key
ThingId Integer unique key
ThingType String check (ThingType = 'PUPIL')
Name String
DateOfBirth Date
foreign key (ThingId, ThingType)
references DocumentedThing (ThingId, ThingType)
Staff
-----
StaffId Integer primary key
ThingId Integer unique key
ThingType String check (ThingType = 'STAFF')
Name String
HireDate Date
foreign key (ThingId, ThingType)
references DocumentedThing (ThingId, ThingType)
L'échafaudage de clés uniques assure qu'un DocumentedThing
peut avoir un dossier dans les deux Staff
ou Pupil
mais pas les deux. De plus, il ne peut y avoir plusieurs enregistrements dans la table de sous-types. Un enregistrement dans Staff
peut uniquement correspondre à un enregistrement dans DocumentedThing
qui a la valeur 'STAFF' dans ThingType
. La seule chose qui est difficile à appliquer est l'insistance qu'un DocumentedThing
doit avoir un enregistrement de sous-type. Cela peut être fait, mais il est généralement compliqué, et dépend dans une certaine mesure de votre choix de produit SGBD.
L'ajout d'un nouveau sous-type a un impact minimal: outre l'ajout de la table réelle pour contenir ses informations, il suffit d'ajouter une nouvelle valeur à DocumentedThing.ThingType
; Si vous avez beaucoup de sous-types, vous pouvez choisir de restreindre cela avec une clé étrangère à une table de consultation plutôt qu'une contrainte de vérification.
Duplicata de http://stackoverflow.com/questions/695752/product-table-many-kinds-of-product-each-product-has-many-parameters/ –