2009-09-25 16 views
6

Tengo eventos y fotos, y luego los comentarios de ambos. En este momento, tengo dos tablas de comentarios, una para los comentarios relacionados con los eventos y otra para los comentarios de las fotos. Esquema es similar a esto:Cuando dos tablas son muy similares, ¿cuándo deberían combinarse?

CREATE TABLE EventComments 
(
    CommentId int, 
    EventId int, 
    Comment NVarChar(250), 
    DateSubmitted datetime 
) 

CREATE TABLE PhotoComments 
(
    CommentId int, 
    PhotoId int, 
    Comment NVarChar(250), 
    DateSubmitted datetime 
) 

Mis preguntas es si debería o no combinarlos, y agregar una tabla de referencias cruzadas por separado, pero no puedo pensar en una manera de hacerlo correctamente. Creo que esto debería estar bien, ¿cuáles son tus pensamientos?

Editar

Sobre la base de la respuesta de Walter (y un poco de lectura ligera), se me ha ocurrido con esto:

CREATE TABLE Comments 
(
    CommentId int, 
    Comment NVarChar(250), 
    DateSubmitted datetime 
    CONTRAINT [PK_Comments] PRIMARY KEY 
    (
    CommentId 
) 
) 

CREATE TABLE EventComments 
(
    CommentId int, 
    EventId int 
) 

CREAT TABLE PhotoComments 
(
    CommentId int, 
    PhotoId int 
) 

ALTER TABLE EventComments ADD CONSTRAINT FK_EventComments FOREIGN KEY (CommentId) REFERENCES Comments(CommentId) 

ALTER TABLE PhotoComments ADD CONSTRAINT FK_PhotoComments FOREIGN KEY (CommentId) REFERENCES Comments(CommentId) 

¿Hay realmente alguna diferencia de rendimiento entre las estructuras? Para mí, parece ser un poco una preferencia. Veo los beneficios en el segundo esquema, si deseo agregar alguna especificidad a los comentarios de eventos o de fotos, tengo una tabla separada para hacerlo, y si quiero que ambos compartan una nueva propiedad, hay una sola tabla para agregue la nueva propiedad.

Respuesta

9

Comentarios, PhotoComments y EventComments se relacionan en un patrón llamado "especialización de generalización". Este patrón se maneja por herencia simple en lenguajes orientados a objetos. Es un poco más complicado configurar un esquema de tablas que capturará el mismo patrón.

Pero está bien entendido. Una búsqueda rápida en Google sobre "modelado relacional de especialización de generalización" le dará varios buenos artículos sobre el tema.

+0

Mejor comentario de diseño puro en la página, en mi humilde opinión. – Rap

+0

Hice algunas investigaciones y actualicé la pregunta.Gracias por la entrada – scottm

+0

Estoy totalmente en desacuerdo con esta respuesta; en la práctica, estás rogando por datos inconsistentes y desordenados. ¿Cómo se eliminan los comentarios? Con frecuencia lo veo configurado como lo implementó ScottM en la pregunta revisada, y casi siempre el comentario permanece en Comentarios, pero el registro relacionado en EventComments o PhotoComments se elimina y usted queda con un registro pendiente en Comentarios. – JasonFruit

1

Puede combinarlos y agregar un campo que indique si se trata de una foto o un evento.

Necesitará dos llaves foráneas; uno para fotos y otro para eventos, pero tenerlos en una tabla le permite escribir un solo conjunto de códigos para manejar todos los comentarios.

Pero estoy desgarrado. Es más limpio si los mantiene separados, siempre que nunca tenga que mezclar los dos tipos de comentarios en la misma lista (lo que requeriría un UNIÓN).

+0

¿Cómo identifico a qué foto o evento está vinculado el comentario y aún así aseguro la integridad referencial? – scottm

+0

Estoy de acuerdo en que parte de esto se vuelve un poco más complejo. –

1

Mi propio estilo de diseño personal sería combinarlos, luego agregar una bandera entera para decir para qué es el comentario. Eso también me da escalabilidad en caso de que quiera agregar más más tarde.

4

Si los combina, arruinará la estructura de las teclas. Deberá tener claves externas nulamente habilitadas o una estructura de clave "suave" de clave y tipo. Los mantendría separados.

+0

Sí, ese fue el problema que me encontré con – scottm

+1

Se relacionan con dos "entidades" diferentes No creo que pertenezcan juntas – Gratzy

+0

Aunque están relacionadas con entidades diferentes, ambas son comentarios. – scottm

Cuestiones relacionadas