Qual è il modo migliore per creare una tabella Una tabella HABTM Una relazione per un'applicazione CakePHP?
-
03-07-2019 - |
Domanda
Ho la necessità di creare la funzionalità per consentire ai miei utenti registrati di associarsi ad altri usi e creare una famiglia. Le tabelle del mio database sono simili al seguente:
db.persons - (Bob, Jane, Timmy, ecc.)
- id
- nome
db.persons_persons
- id
- person__id_parent
- person_id_child
- relationtype_id
db.relationtypes - (coniuge, figlio, nipote, ecc.)
- id
- nome
Con questa struttura, dovrei essere in grado di specificare che Bob è un coniuge di Jane nella tabella persons_persons. Il record in db.persons_persons sarebbe simile a (psuedo):
ID | person_parent | person_child | relationtype
1 | Bob | Jane | Spouse
2 | Bob | Timmy | Child
Mi rendo conto che ciò potrebbe causare una frammentazione dei dati poiché se Bob e Jane sono sposati, un figlio dell'uno dovrebbe essere associato all'altro. Tuttavia questa non è la mia domanda. La mia domanda è se questa configurazione del database sia o meno "corretta" per l'uso in un'applicazione cakePHP.
Soluzione
In primo luogo, CakePHP fletterà automaticamente una tabella people
in un controller people
e un modello person
, quindi non è necessario chiamare persone
. Quindi chiamerei la tabella di ricerca relazioni
anziché persons_persons
.
Chiamerei i campi nella tabella delle relazioni person_id
, relationship_id
e relationship_type_id
, quindi aggiungerei un carattere di sottolineatura nel tuo relazione tipo
nome tabella in modo che diventi tipo_ relazione
.
Penso che questo sia più semantico.
Puoi ancora utilizzare un'associazione hasAndBelongsToMany e utilizzare l'automagic " con " associazioni offerte da CakePHP (solo 1.2) per accedere ai dati aggiuntivi nella tabella HABTM per il tipo di relazione.
Tuttavia, sarei tentato di usare:
-
Person
ha molteRelation
-
Relazione
appartiene aPersona
,Relazione
,RelationType
Nella tua app, la relazione di qualcuno è implicita nella relazione di qualcun altro con loro? Cioè se trovi Person.id = 1 potresti ottenere tutte le loro relazioni, ad es. Person.id 2, 3 e 4. Ma se trovi Person.id 2, non otterrai automaticamente Person.id = 1, a meno che non ci fosse un altro record nella tabella delle relazioni che rappresentasse quella relazione.
Per raggiungere questo obiettivo, puoi impostare un'altra associazione:
-
Person
ha molterelazione1
con foreignKeyperson_id
-
Person
ha molterelazione2
con foreignKeyrelation_id
-
Relazione
appartiene aPersona
,Relazione
,RelationType
Nota, puoi ottenere questa doppia relazione anche con HABTM.