2012-10-10 21 views
7

que tienen una tabla de usuarios:Tabla consejos de diseño

user_id - name 

Y los usuarios pueden crear un artículo y luego compartirlo con otros miembros, artículos de mesa:

article_id - user_id - article_name 

La pregunta es la mejor manera de compartirlo ... estoy pensando en otra mesa article_shares:

share_id - article_id - user_id 

esto simplemente una lista de todos los usuarios con acceso a la Aerticle y el creador tendrían acceso para poder agregar o eliminar de esa tabla el artículo que crearon

Por lo tanto, cuando el creador del artículo (user_id 123) mira sus artículos, puede ver una lista de todos los demás usuarios que ha compartido cada artículo con

select as.user_id, a.article_name from article_shares as 
join users u on u.user_id = as.user_id 
join articles a on a.article_id = as.article_id where u.user_id = '123' 

y un usuario (user_id 456) puede ver una lista de artículos que han sido compartidos

select a.article_name from articles a 
join article_shares as on as.article_id = a.article_id 
where as.user_id = '456' 

¿Le parece lógico? ¿Estoy en el camino correcto?

Gracias por cualquier ayuda

+3

sí me parece bien. Necesita una forma de relacionar los artículos compartidos con los usuarios que pueden verlos, no se me ocurre una manera más fácil. – Jay

+0

@Jay Gracias, solo aprendí acerca de las combinaciones hace dos días, ¡así que gracias por tomarse el tiempo para echar un vistazo! –

+0

Estás en el camino correcto. Una vez que se sienta cómodo con el uso de JOIN, y todas sus formas (INTERIOR, IZQUIERDA, etc.) ¡puede sentir que no hay nada que no pueda hacer! :) –

Respuesta

1

Lo tienes todo. Si tiene curiosidad, creó junction table para crear su relación de varios a varios entre users y articles, y esto es bastante estándar.

A menudo verá este tipo de tablas con el nombre ArticlesToUsers o algo similar, y que a veces será la primera forma de avisarle que está mirando una mesa de unión. Por supuesto, los esquemas de nombres son bastante subjetivos, así que no sientas la necesidad de cambiar el nombre. article_shares me parece una buena descripción.

Como @MaxVT ha demostrado, encontrará que muchos desarrolladores no pondrán un surrogate key en una tabla de unión como esta, y preferirían simplemente usar ambas columnas como clave principal (article_id, user_id). La elección es obviamente suya y puede tener más que ver con la coherencia con el resto de las tablas de la base de datos, aunque seguramente verá todas las permutaciones en la naturaleza. En caso de que conserve su clave sustituta, recomendaría una restricción única de article_id, user_id para eliminar duplicados (¿por qué un artículo debe compartirse dos veces con un usuario?).

+0

Gracias Tim, ¡agradece ese consejo! –

Cuestiones relacionadas