Quali vantaggi abbiamo quando creiamo una tabella di mappatura separata per due tabelle relazionali

7

In vari CMS open source, ho notato che esiste una tabella separata per mappare due tabelle relazionali. Come per le categorie e i prodotti, esiste una tabella product_category_mapping separata. Questa tabella ha solo una chiave primaria e due chiavi esterne dalle categorie e dalle tabelle dei prodotti.

La mia domanda è quali sono i vantaggi di questa progettazione di database anziché collegare semplicemente le tabelle direttamente definendo una chiave esterna in entrambe le tabelle? È solo questione di convenienza?

    
posta Pankaj Upadhyay 13.11.2011 - 12:22
fonte

3 risposte

7

Tale tabella viene spesso definita tabella di collegamento o tabella di bridge .

È il modo standard per creare una relazione molti-a-molti. Con una chiave esterna diretta tra le due tabelle, è possibile solo creare una relazione uno-a-molti (poiché anche la chiave primaria a cui punta la chiave esterna è un vincolo univoco) o una relazione uno a uno (se il anche la chiave esterna è un vincolo univoco).

A seconda della filosofia di progettazione del DB, la colonna chiave primaria viene spesso lasciata fuori, e la chiave primaria della tabella bridge è composta dalle due colonne chiave esterna (è necessario comunque un vincolo univoco su queste colonne, quindi perché no? renderlo la chiave primaria?).

    
risposta data 13.11.2011 - 12:30
fonte
2

È un modo semplice per implementare relazioni molte-a-molti .

Considera queste due tabelle:

category
--------
categoryID [PK]
categoryName

product
-------
productID [PK]
productName

Se aggiungi un categoryID campo a product , ogni prodotto può avere solo una categoria. Ma se abbiamo un product_category_mapping come questo:

product_category_mapping
------------------------
mappingID [PK]
productID [FK]
categoryID [FK]

quindi possiamo avere:

mappingID  productID  categoryID
--------------------------------
1          1          1
2          1          2
3          2          3
4          2          1  

Quindi il prodotto 1 appartiene alla categoria 1 e amp; 2 e il prodotto 2 appartiene alla categoria 3 e amp; 1, tanti prodotti appartengono a molte categorie e molte categorie hanno molti prodotti.

Come scrive tdammers , questa tabella viene spesso definita una tabella di collegamento o una tabella bridge e l'ho persino vista come una tabella HABTM, da HasAndBelongsToMany che apparentemente Ruby on Rails parla a molti a molti. E Wikipedia la chiama una tabella di giunzione e ha molti altri nomi per essa.

    
risposta data 13.11.2011 - 12:34
fonte
1

Il motivo per usare una tabella di mappatura è eliminare la duplicazione. Vai avanti e prova un'altra tecnica di mappatura. Non potrai impedire la duplicazione dei dati senza di essa.

E questo porta una domanda 2cd. Perché preoccuparsi di eliminare la duplicazione? Quindi devi solo modificare i dati 1 volta in 1 posto. A volte ci sono penalità di prestazioni per eliminare la duplicazione. Altre volte ci sono INCREMENTI delle prestazioni per eliminare la duplicazione. Ad esempio, è più veloce compilare un elenco a discesa con valori di ricerca normalizzati, anziché selezionare valori duplicati distinti in una grande tabella.

    
risposta data 13.11.2011 - 14:14
fonte

Leggi altre domande sui tag