Supponiamo che io abbia le seguenti tabelle:SQL: normalizzazione della banca dati, pur mantenendo i vincoli
____________________ ____________________
| Organisms | | Species |
|--------------------| |--------------------|
|OrganismId (int, PK)| |SpeciesId (int, PK) |
|SpeciesId (int, FK) |∞---------1|Name (varchar) |
|Name (varchar) | |____________________|
|____________________| 1
1 |
| |
| |
∞ ∞
______________________ ____________________ _______________
| OrganismPropsValues | | SpeciesProps | | Props |
|----------------------| |--------------------| |---------------|
|OrganismId (int, FK) | |PropId (int,PK,FK) | ∞-----1|PropId (int,PK)|
|PropId (int, FK) | |SpeciesId(int,PK,FK)| |Name (varchar) |
|Value (varchar) | |____________________| |_______________|
|______________________| 1
∞ |
| |
-----------------------------------------------------------
Una rapida spiegazione di quello che sto cercando di rappresentare qui: supponiamo di avere un elenco di specie, come gatto, cane , umano, ecc Abbiamo anche un set di proprietà (puntelli abbreviati così ho potuto adattarsi più facilmente nel diagramma) applicabili in alcuni, ma non necessariamente tutte le specie - per esempio, puo essere lunghezza della coda (per le specie con code), il colore degli occhi (per quelli con gli occhi), ecc
SpeciesProps è una tabella linker che definisce quali si applicano le proprietà a cui species-- ecco che wou ld {Human, Eye Color}, {Dog, Eye Color}, {Cat, Eye Color}, {Dog, Tail Length}, {Cat, Tail Length}. Non abbiamo {Human, Tail Length} perché Tail Length non è ovviamente una proprietà valida da applicare a un essere umano.
La tabella Organismi contiene "implementazioni" effettive delle specie-- Quindi qui potremmo avere {Human, Bob}, {Dog, Rufus} e {Cat, Felix}.
Ecco ora il mio problema: nella tabella OrganismPropsValues, voglio memorizzare i "valori" delle proprietà per ciascun organismo - così, ad esempio, per Bob voglio memorizzare {Bob, Eye Color, Blue}. Per Rufus, vorrei memorizzare {Rufus, Eye Color, Brown} e {Rufus, Tail Length, 20} (simile a Felix). Il mio problema però, è che nello schema che ho descritto, è perfettamente possibile memorizzare {Bob, Coda Lunghezza, 10}, anche se il {umana, terminale Lunghezza} tupla non esiste in SpeciesProps. Come posso modificare questo schema in modo da poter applicare i vincoli definiti in SpeciesProps in OrganismPropsValues, pur mantenendo un'adeguata normalizzazione?
A seconda del DB (ad esempio Oracle) Vorrei solo creare un po 'di stored procedure per INSERT/UPDATE/DELETE e realizzare qualsiasi vincoli complessi in là ... – Yahia
@Yahia grazie per il suggerimento, ma se c'è un modo per farlo senza introdurre procedure, trigger, ecc. Preferirei questo. Questo è MS-SQL (2008). – Andrew
Mi ha fatto male alla testa.Questo sarà orribile da interrogare (pensa a quanti join ci vorranno per ottenere tutti i dati su un essere umano!) Ed è un progetto così povero che non so da dove cominciare. I database non sono oggetti e non devono essere progettati come oggetti. Le tabelle EAV sono una soluzione estremamente scadente. Assumi un vero progettista di database. – HLGEM