Puede una tabla de unión (join de la tabla) también ser utilizado para una relación de uno a muchos relación?

StackOverflow https://stackoverflow.com/questions/843772

Pregunta

Según la definición, un Tabla De Unión (puente de tabla/tabla de enlaces) se utiliza para muchos-a-muchos las relaciones, cuando se utiliza como este:

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)
)

Pero no podía también ser utilizado fácilmente para un uno-a-muchos de relaciones, como en este ejemplo en el que un usuario está asociado con muchos pedidos:

(No entiendo bases de datos bien así que por favor me corrija si he entendido algo.)

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)
)
¿Fue útil?

Solución

Sí, todavía es posible almacenar y aplicar de uno a muchos relación en una tabla de unión.

En su ejemplo, usted no cumplimiento de cualquiera de las restricciones en la UserOrders tabla de unión, por lo que una sola orden puede pertenecer a dos usuarios (suponiendo que es incorrecto).Para exigir que se podía hacer OrderKey ser la clave principal de la UserOrders tabla de unión (o tener una única restricción en la columna).Técnicamente que sólo se convertirá en un muchos-a-uno relación entre UserOrders y Users, a pesar de tener uno-a-uno relación entre Orders y UserOrders.

Sólo puedo pensar en una razón para el diseño de la muchos-a-uno relación utilizando la tabla de unión - si va a permitir que el muchos-a-muchos relación en el futuro y no quiere lidiar con la migración de datos.Pero en la media hora que usted pagará el costo de almacenamiento y en la unión con mesa adicional.

Otros consejos

No hay ninguna razón por la cual una tabla de unión no se pueda utilizar para una relación de uno a muchos. La pregunta suele ser una de rendimiento. ¿Por qué hacer que la base de datos se una a una tabla adicional cuando es innecesaria?

Esto sería muchos a muchos:

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

Esto sería uno a muchos (un usuario tiene muchos pedidos):

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

Observe la diferencia en la restricción PRIMARY KEY.

Una vez que ha creado una tabla, realmente no tiene un tipo de " Junction " tabla, " asociativo " tabla, " únete a " mesa - es solo una mesa.

Utilizamos estos términos para describir una razón específica por la cual se creó inicialmente una entidad (y la tabla resultante). Las entidades asociativas se crean, inicialmente, para resolver una situación de muchos a muchos. Pero estas tablas a menudo tienen sus propios atributos (como el momento de la asociación, una razón para la asociación, etc.). Entonces, SQL Server, Oracle o su código no tienen razón para saber por qué se creó una tabla ... solo que es una tabla.

Desde un punto de vista técnico, realmente no hay ninguna diferencia entre una tabla asociativa y cualquier otra tabla.

Por lo tanto, estas tablas pueden cumplir cualquier función que cualquier otra tabla pueda cumplir. No hay reglas sobre cómo otras tablas también pueden relacionarse con ellas.

Puede aplicar de " one " restricción en la tabla de unión / unión agregando una restricción única (o convirtiéndola en la clave principal de la tabla de unión, porque solo ese atributo identifica la relación) a la columna que es una clave foránea para " muchos quot; lado. Esto se debe a que desea que rwos en el lado múltiple solo tenga una relación y las relaciones se establecen en la tabla de unión / unión.

Creo que entendiste mal el concepto: aquí está la explicación simple si podría ayudar: Para lograr una relación Muchos-Muchos entre dos tablas (por ejemplo, A y B), necesitamos la ayuda de una tabla de unión (por ejemplo, tabla c) que tendrá una relación uno-muchos con ambas tablas A y B.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top