2010-02-19 9 views
7

Estoy en el proceso de crear una red social. Tiene varias entidades como noticias, fotos, que pueden tener comentarios. Como todos los comentarios tienen las mismas columnas y se comportan de la misma manera, y la única diferencia es su tipo - noticias, fotos o algo más que se agregará en el futuro - decidí crear una tabla para todos los comentarios con una columna llamada type . Funcionó perfectamente hasta que decidí agregar claves externas a mi esquema de base de datos.¿Cómo puedo crear una clave externa en una columna, cada registro de los cuales puede referirse a una columna en una de varias tablas?

La tabla comment tienen una columna parent, que se refiere a id de news o photo tabla, dependiendo de la columna type.

El problema es que no puedo agregar una clave externa que hace referencia a la tabla desconocida de antemano, y aún más, que hace referencia a varias tablas a la vez.

Toda la base de datos ahora utiliza claves externas, excepto esta columna parent en la tabla comment. Me molesta porque es el único lugar donde no puedo agregar una clave externa.

Estoy seguro de que no puedo crear una clave foránea; algo en mi diseño de base de datos necesita ser cambiado. Decidí crear una tabla para que los comentarios estuvieran listos para agregar nuevos tipos de comentarios para nuevas entidades en el futuro -vídeo, música, artículo, etc.- y no entrar en un infierno de mantenimiento cuando quiero agregar una nueva columna para todos los comentarios .

Si tengo que crear una tabla por separado para cada tipo de comentario para poder utilizar completamente las claves foráneas, lo haré. Pero tal vez ya exista otra solución común a este problema, ¿y no lo sé?

Tal vez debería crear algún tipo de tabla de enlaces, que vincule la tabla comment con las tablas de otras entidades? Pero tal vez esta solución sea aún más compleja que crear una tabla separada para cada tipo de comentario.

Tal vez debería tener varias columnas en la tabla comment, como newsId, photoId, a las que puedo agregar una clave externa?

Estas soluciones simplemente no me parecen elegantes, o simplemente malinterpreto algo. Toda mi percepción de este problema podría estar completamente equivocada. Es por eso que estoy aquí. Por favor comparte tus ideas.

+0

Me ha resultado difícil elegir ** una ** respuesta correcta: la primera se relaciona con una respuesta similar, y la segunda está escrita específicamente para mi pregunta; ambas son buenas. Elegí la segunda, la de APC, porque es más detallada y usa mis términos. Gracias a los dos. –

+0

posible duplicado de [Clave externa que hace referencia a las claves principales en varias tablas?] (Http://stackoverflow.com/questions/668921/key-keyboard-refering-to-primary-keys-across-multiple-tables) –

Respuesta

5

Creo que su problema es que tiene varias entidades: noticias, fotos. Pero estos son solo tipos de (por ejemplo) artículos. Al igual que los comentarios, los elementos probablemente tendrán algunos atributos en común, así como algunos atributos distintos. Uno de esos atributos será la capacidad de ser comentado.

En este enfoque tiene una tabla CommentableItems(1), con los atributos en común. Luego tiene algunas subtablas NewsItems, PhotoItems, etc. Es bastante fácil configurar las claves de estas tablas para aplicar la relación uno a uno requerida. Obviamente, los Comentarios tienen una clave externa que hace referencia al CommentableItems.

(1) En realidad, probablemente dispararía a mí mismo en lugar de permitir que una tabla llamada algo tan espantoso como CommentableItems en mi esquema, pero esto es sólo por el bien de ejemplo.

+0

Creo Realmente lo nombraré como 'Commentable', porque no puedo pensar en otro nombre más apropiado. 'Entity' sería un nombre demasiado amplio, porque no todas las entidades son commentables. –

Cuestiones relacionadas