Bonjour,
Je suis en train de réfléchir à comment modéliser un inventaire. Dans celui-ci on trouverait des biens, principalement informatique, des personnes et leurs accès à différentes applications.
Ma première question porte sur l'allure générale du schéma. Il est évident pour moi que de nombreux objets (objet = un bien, une personne, un accès à une application) auront des similitudes.
Je souhaite par exemple qu'on puisse laisser une commentaire sur à n'importe quel objet (un texte daté, lié à l'objet en question).
Je souhaite par exemple que certains objets (les biens physiques) puissent être associé à une localisation.
Il y aura un nombre non négligeable d'objets différents (entre 20 et 30 à la louche)
Pour éviter d'avoir une table commentaire par type d'objet, une table d'association de localisation par type d'objet, l'idée que j'ai est de mettre en place un héritage exclusif de la façon décrite dans cet article pour garantir la contrainte d'exclusivité via des clés étrangères et non via des trigger.
J'aurai donc les tables suivantes comme base :
1 2
| object_type(object_type_id, nom) pk = (object_type_id), unique constraint sur (nom)
object(object_id, object_type_id) pk = (object_id), fk (object_type_id) vers object_type(object_type_id) |
Et par exemple comme objet d'inventaire :
1 2
| person(person_id, object_type_id, nom, ...) pk = (person_id), fk (person_id, object_type_od) vers object(object_id, object_type_id), check sur object_type_id = X
account(account_id, object_type_id, login, ...) pk = (account_id), fk (account_id, object_type_od) vers object(object_id, object_type_id), check sur object_type_id = Y |
Pour lier un commentaire à n'importe quel objet, je n'ai dès lors besoin que d'une table :
comment(id, text, date, object_id) pk = (id), fk (object_id) vers object(object_id)
Si je veux lier quelque chose à certains types d'objet, ça n'est guère plus compliqué :
locate(id_localisation, object_id, object_type_id) pk = (id_localisation, object_id), fk(object_id, object_type_id) vers object(object_id, object_type_id)
Je peux garantir le type d'objet soit via une contrainte CHECK sur object_type_id, soit en créant une table d'une seule colonne contenant les types d'objets que je peux lier et en faisant une clé étrangère de (object_type_id) vers cette table.
La solution de la table permet de faire évoluer les types auxquels on peut lier une localisation sans devoir toucher au schéma.
Que pensez-vous de cette façon de faire ?
Ma seconde question concerne l'historisation. Au fur et à mesure, il y aura du changement dans les données. Un bien va changer de libellé, de localisation, ... et j'aimerais pouvoir garder une trace de ces évolutions.
En cherchant, j'ai vu plusieurs méthodes d'historisation (table de faits, scd, archivages, ...), mais je n'arrive pas à déterminer ce qui serait le plus pertinent.
J'ai également envisagé de faire cette historisation par une "simple" table de notifications qui ferait référence à la table object.
1 2 3
| notification_type(notification_type_id, code, text)
notification(notification_id, notification_type_id, date, param)
notification_object(object_id, notification_id) |
Auriez-vous des retours d'expérience sur l'historisation dans ce genre de cadre ?
D'avance merci.
Partager