Domanda

Secondo la definizione, un Tavolo di giunzione (tabella ponte / tabella dei collegamenti) viene utilizzato per relazioni molti-a-molti, se utilizzato in questo modo:

CREATE TABLE Users
(
UserLogin varchar(50) PRIMARY KEY,
UserPassword varchar(50) NOT NULL,
UserName varchar(50) NOT NULL
)


CREATE TABLE Permissions
(
PermissionKey varchar(50) PRIMARY KEY,
PermissionDescription varchar(500) NOT NULL
)


--This is the junction table.
CREATE TABLE UserPermissions
(
UserLogin varchar(50) REFERENCES Users (UserLogin),
PermissionKey varchar(50) REFERENCES Permissions (PermissionKey),
PRIMARY KEY (UserLogin, PermissionKey)
)

Ma non potrebbe essere usato altrettanto facilmente per relazioni uno-a-molti, come in questo esempio in cui un utente è associato a molti ordini:

(Non capisco bene i database, quindi correggimi se ho frainteso qualcosa.)

CREATE TABLE Users
(
UserLogin varchar(50) PRIMARY KEY,
UserPassword varchar(50) NOT NULL,
UserName varchar(50) NOT NULL
)


CREATE TABLE Orders
(
OrderKey varchar(50) PRIMARY KEY,
OrderDescription varchar(500) NOT NULL
)


--This is the junction table.
CREATE TABLE UserOrders
(
UserLogin varchar(50) REFERENCES Users (UserLogin),
OrderKey varchar(50) REFERENCES Orders (OrderKey),
PRIMARY KEY (UserLogin, OrderKey)
)
È stato utile?

Soluzione

Sì, è ancora possibile archiviare e applicare la relazione uno-a-molti in una tabella di giunzione.

Nel tuo esempio non stai applicando alcun vincolo sulla tabella di giunzione UserOrders, quindi un singolo ordine può appartenere a due utenti (supponendo che sia errato). Per imporre che potresti rendere OrderKey la chiave primaria della Users tabella di giunzione (o avere un vincolo univoco su quella colonna). Tecnicamente diventerà una relazione molti-a-uno tra Orders e <=>, pur avendo una relazione uno a uno tra <=> e <= >.

Posso solo pensare a un motivo per progettare la relazione molti-a-uno usando la tabella di giunzione - se prevedi di consentire la relazione molti-a-molti in futuro e non voglio occuparmi della migrazione dei dati. Ma nel frattempo pagherai il costo della memorizzazione e della partecipazione a una tabella aggiuntiva.

Altri suggerimenti

Non vi è alcun motivo per cui una tabella di giunzione non possa essere utilizzata per una relazione uno-a-molti. La domanda di solito riguarda le prestazioni. Perché rendere il database unito a una tabella aggiuntiva quando non è necessario?

Questo sarebbe molti a molti:

CREATE TABLE UserOrders
(UserLogin varchar(50) REFERENCES Users (UserLogin),
OrderKey varchar(50) REFERENCES Orders (OrderKey),
PRIMARY KEY (UserLogin, OrderKey));

Questo sarebbe uno-a-molti (un utente ha molti ordini):

CREATE TABLE UserOrders
(UserLogin varchar(50) REFERENCES Users (UserLogin),
OrderKey varchar(50) REFERENCES Orders (OrderKey),
PRIMARY KEY (OrderKey));

Nota la differenza nel vincolo PRIMARY KEY.

Dopo aver creato una tabella, in realtà non ha un tipo di " Junction " tabella, " associativa " tabella, " join " tabella - è solo una tabella.

Usiamo questi termini per descrivere un motivo specifico per cui un'entità (e la tabella risultante) è stata inizialmente creata. Inizialmente vengono create entità associative per risolvere una situazione molti a molti. Ma queste tabelle abbastanza spesso hanno attributi propri (come il tempo dell'associazione, un motivo per l'associazione, ecc.). Quindi SQL Server, Oracle o il tuo codice non hanno motivo di sapere perché è stata creata una tabella ... solo che è una tabella.

Da un punto di vista tecnico, non c'è davvero alcuna differenza tra una tabella associativa e qualsiasi altra tabella.

Quindi queste tabelle possono ricoprire qualsiasi ruolo che qualsiasi altra tabella può svolgere. Non ci sono regole su come anche altre tabelle possano essere correlate ad esse.

Puoi applicare de " uno " vincolo nella tabella join / junction aggiungendo un vincolo univoco (o rendendolo la chiave primaria della tabella join, perché solo tale attributo identifica la relazione) alla colonna che è una chiave esterna per la quotazione &; molti quot; lato. Questo perché vuoi che i rwos nelle molte parti abbiano solo una relazione e le relazioni sono indicate nella tabella join / junction.

Penso che tu abbia sbagliato il concetto - Ecco la semplice spiegazione se potrebbe aiutare: Per ottenere una relazione Many-Many tra due tabelle (diciamo, A e B), dobbiamo prendere l'aiuto di una tabella di giunzione (diciamo, tabella c) che avrà una relazione uno-molti con entrambe le tabelle A e B.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top