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.

È stato utile?

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top