Un altro molti-molti Scenario
-
09-09-2019 - |
Domanda
Il mio modello di database dispone di 2 tavoli particolari in esso che richiedono una relazione molti-a-molti. I tavoli sono Systems
e Users
. Un utente può essere membro di più di un sistema ed un sistema ha più di un utente in esso.
system_id
è la PK nella tabella di sistema ed è user_id
PK nella tabella utente. Io li ho collegati con system_id
come FK nella tabella user. Io non riesco a capire un tavolo tra i due. Ho avuto l'idea di formare un tavolo system_user
e l'utilizzo di entrambe le chiavi esterne in lì, ma posso vedere come dovrebbe funzionare.
Soluzione
Si sta andando nella giusta direzione.
Creare una tabella "system_user":
CREATE TABLE system_user (system_id INT NOT NULL, user_id INT NOT NULL);
Questa non è propriamente un'entità in senso stretto modellazione relazionale, quindi non richiede una chiave primaria. Tuttavia, è possibile aggiungere uno se gli scenari richiedono.
Per ottenere tutti gli utenti in un sistema che ci si ricerca in questo modo:
SELECT u.* FROM user u, system_user su WHERE su.system_id = ?
Per ottenere tutti i sistemi che un utente può raggiungere, che ci si ricerca in questo modo:
SELECT s.* FROM system s, system_user su WHERE u.user_id = ?
Spero che questo aiuti!
Altri suggerimenti
Hai capito bene. Utilizzare una tabella di mappatura per molti a molti rapporti. Non avrete bisogno di tutte le colonne chiave esterna nei vostri sistemi o tabelle Utenti. La vostra tabella di mappatura avrà qualcosa come un MappingID PK, SystemID e UserID. Si potrebbe anche fare un'intera riga del PK, ma la sua inutile (se non si desidera utilizzare il MappingID). Quindi, è sufficiente inserire le coppie in questa tabella che associa un sistema con un utente. È possibile selezionare da SystemID o UserID per ottenere tutte le relazioni di una certa entità ha. Si può anche includere tutti i metadati la mappatura potrebbe avere, come la data è stata stabilita l'associazione.
System System_User User ------ ----------- ---- *system_id ---> *system_id data *user_id <--- *user_id data * denotes the primary key columns ---> denotes a PK/FK relationship
Sei sulla strada giusta. Il tuo nuovo tavolo system_user avrebbe come minimo avere 3 colonne:
- systemuser_id - chiave primaria
- user_id - chiave esterna alla tabella degli utenti
- system_id - chiave esterna alla tabella di sistema