2010-08-01 23 views
17

La forma habitual de establecer una restricción de clave externa es elegir a qué tabla apuntará la clave externa.¿Clave externa a una de muchas tablas?

Tengo una relación polimórfica entre 1 tabla y un conjunto de tabla.

Eso significa que esta tabla tendrá una relación con una de esas tablas en el conjunto.

por ejemplo.

images: person_id, person_type 
subordinates: id, col1, col2...col9 
products: id, colA, colB...colZ 

En el ejemplo anterior, si person_type es "subordinados" entonces person_id deben ser una clave externa a subordinates.id y lo mismo ocurre con los productos.

Así que me pregunto, ¿es posible tener una clave externa para una de muchas tablas, o tiene que establecer específicamente a qué tabla apunta cuando asigna uno.

Esta pregunta es para MySQL y PostgreSQL.

Gracias

+0

[Puede hacer esto en Yii framework] (http://www.yiiframework.com/forum/index.php/topic/20018-conditional-relation) – Alireza

Respuesta

41
+3

wow ... ¿Cómo se las arregló para encontrar todos esos enlaces +1! –

+9

búsqueda por ID de usuario y por etiqueta: 'usuario: 20860 [asociaciones polimórficas]' –

2

A-clave externa, por definición, debe apuntar a una tecla de primaria o candidate- en uno y solamente uno de mesa - de primaria solamente está disponible en un DBMS típico. Es mejor tener una sola tabla de "personas" y tener tablas relacionadas con esto, p. información del gerente.

1

Una columna es solo un marcador de posición por un valor. Una restricción de clave externa significa que los datos almacenados dentro de esa columna solo pueden ser un valor que coincida con la columna de la tabla definida en la restricción. Las restricciones de clave externa son por tabla ...

No hay nada que le impida definir múltiples restricciones de clave externa en una columna. Pero esto significa que el único valor que se permite almacenar serán los valores que ya existen en todas las demás tablas relacionadas con el exterior. IE: TABLE_1 tiene valores 1 y 2, TABLE_2 tiene valores 2 y 3 - TABLE_3 tiene relaciones de clave foránea definidas en las tablas 1 & 2 en la columna TABLE_3 col ... El único valor válido que puedo insertar en TABLE_3.col es 2, porque está en ambos tablas (suponiendo que col no se puede anular).

1

Una clave externa solo puede apuntar a una sola tabla.

Me parece que lo que realmente quería hacer aquí es crear una identificación para padres en su mesa de personas. Los subordinados tendrían una identificación de padres apuntando a sus gerentes. Si un subordinado necesita tener varios administradores, se puede crear una tabla de unión separada con 2 columnas, cada una de las cuales contiene una identificación de persona, una es el subordinado y la otra es uno de los administradores.

Si desea restringir quién podría asignarse al campo parentid esto podría hacerse con una restricción de verificación.

+0

MySQL tiene, pero no aplica, restricciones CHECK. Lo que describes todavía es una relación de clave externa, solo para la misma tabla, lo que generalmente significa que necesitas consultas recursivas/jerárquicas, que MySQL no tiene (PostgreSQL 8.x sí). –

+0

Eso no era lo que quería hacer, no tenía muy claro lo que quería decir. Mira mis tablas y columnas actualizadas y entenderás lo que estoy buscando. –

+0

Por mucho que detestara este tipo de respuesta, definitivamente tengo la sensación de que "lo que quieres está mal" aquí. Creo que @Bill Karwin tiene la idea correcta. – Mykroft

Cuestiones relacionadas