Structure table évolutive

Répondre
doc
Messages : 187
Enregistré le : dim. févr. 26, 2017 4:39 pm

ven. août 04, 2017 10:57 am

Bonjour les devs,

J'ai besoin d'une structure table évolutive à la manière de l'extension builder et je me pose la question quant à la gestion de celle-ci.
Je veux la possibilité de pouvoir créer des rapports d'interventions différents selon les clients mais de manière simple et évolutive, comme suit:

Exemple de rapport:

RAPPORT DE BASE
- numero
- signature client
- signature intervenant
- date création

RAPPORT POUR CLIENT A (rapport de base auquel je rajoute les champs suivant)
- intervention terminée (type boolean)
- état (type liste de valeurs)


Les types de champs du formulaire de rapport seront:
- liste de valeurs : valeur 1, valeur 2, valeur n
- boolean : Oui, Non
- champ texte
- date
- heure
- numerique : integer, float, double, ...
- signature : image
- photo : image
- geolocalisation : sous forme texte ex.: "[42.5910451, 8.4249141]"
- multi-select : possibilite de selectionner plusieurs valeurs

Là où je bloque un peu c'est au niveau des champs, j'ai pensé faire une table pour chaque type de champs et une table pivot pour faire le lien avec le rapport:

Les 4 principales table pour les type de champs

REPORT_STRING_FIELD (pour les champs texte et geolocalisation
- NAME
- VALUE (varchar)

REPORT_DATE_FIELD (pour les champs date))
- NAME
- VALUE (date)

REPORT_TIME_FIELD (pour les champs heure))
- NAME
- VALUE (time)

REPORT_NUMERIC_FIELD (pour les champs boolean et numerique)
- NAME
- VALUE (double) // pour prendre en charge aussi bien les integer que les float

REPORT_DATA_FIELD (pour les champs signature et images)
- NAME
- VALUE (bytea)

REPORT_ENUM_FIELD (pour les champs liste de valeurs et multi-select)
- NAME
- VALUE (enum)

...

REPORT_HAS_FIELD
- REPORT_ID // identifiant du rapport
- TABLE // le nom de la table ex.: REPORT_NUMERIC_FIELD
- ID // l'indentifiant sur cette même table

De plus, il me semble qu'il n'est pas possible d'initialiser un champ enum vide et PostgreSQL ne permet que d'ajouter une valeur pas d'en supprimer (ALTER TYPE name ADD VALUE new_enum_value [ { BEFORE | AFTER } existing_enum_value ]) et que la couche d'abstraction ne permet pas de travailler sur des champs enum, je me trompe ?

L'autre solution serait de rajouter une table dédiée
REPORT_ENUM_FIELD (pour les champs liste de valeurs et multi-select)
- NAME
- VALUE (varchar)

REPORT_ENUM_FIELD_VALUES
- REPORT_ENUM_FIELD_ID
- NAME

En pièce jointe le diagram, ce sera plus parlant.

Qu'en pensez vous ??
Fichiers joints
diagram.png
diagram.png (99.68 Kio) Vu 1907 fois
Répondre