Supponiamo che tu stia modellando e applichi in cui avrai 4 tipi di entità, ad esempio
- a
Person
- a
Job
- a
Machine
- a
Chemical
Ora devi modellare tutte le possibili relazioni (N: M) tra quelle entità, perché la tua logica aziendale è tale che ha davvero senso, quindi finisci per avere molte tabelle:
-
Person_Job (person_id, job_id)
-
Person_Machine (person_id, machine_id)
-
Person_Chemical (person_id, chemical_id)
-
Job_Machine (job_id, machine_id)
-
Job_Chemical (job_id, chemical_id)
-
Machine_Chemical (machine_id, chemical_id)
Questa è (4 x 3) / 2 = 6
tabelle.
Ora, se interviene un'altra entità, diventerebbero (5 x 4) / 2 = 10
tabelle; e con un altro (6 x 5) / 2 = 15
tabelle, e così via, ogni volta aggiungendo un'altra N - 1
di tabelle.
Sarebbe comunque corretto implementarne solo uno aggiuntivo?
-
Relations (from_entity, from_id, to_entity, to_id)
In questo modo, mi sembra che sia meno corretto da un punto di vista formale, ma con solo due tabelle puoi modellare qualsiasi tipo di relazione nel sistema.
A quale numero di entità e relazioni potrebbe essere preferibile quest'ultima forma prima della prima?
Tieni presente che questo è solo un esempio inventato per chiarire il problema in questione: il dominio reale conterrebbe molte entità, circa 30.
EDIT: Penso che possiamo ancora avere l'integrità della chiave esterna RDBMS con alcune tabelle aggiuntive, ad esempio
EntityType (
entity_type varchar primary key
)
Entity (
entity_uuid uuid primary key,
entity_type varchar references EntityType(entity_type),
)
Relations (
from_uuid uuid references Entity(entity_uuid),
to_uuid uuid references Entity(entity_uuid),
primary key (from_uuid, to_uuid)
)
Job (
job_uuid references Entity(entity_uuid),
job_name varchar,
[...]
)
Person (
person_uuid references Entity(entity_uuid),
person_first_name varchar,
person_last_name varchar,
[...]
)
In tale scenario, per prima cosa inserisci la riga nella tabella Entity
e poi nella tabella specifica; allo stesso modo si farebbero le delezioni sulla tabella Entity
e i vari FK potrebbero fare un DELETE CASCATA per mantenere i dati coerenti.