Soy un desarrollador de software. Me encanta codificar, pero odio las bases de datos ... Actualmente, estoy creando un sitio web en el que un usuario podrá marcar una entidad como me gusta (como en FB), etiquetarla y comentar .
Me atasco en el diseño de tablas de bases de datos para manejar esta funcionalidad. La solución es trivial, si podemos hacer esto solo para un tipo de cosas (por ejemplo, fotos). Pero necesito habilitar esto para 5 cosas diferentes (por ahora, pero también asumo que este número puede crecer, a medida que crece todo el servicio).
Encontré algunas preguntas similares aquí, pero ninguna de ellas tiene una respuesta satisfactoria, por lo que estoy haciendo esta pregunta nuevamente.
La pregunta es cómo diseñar la base de datos de manera adecuada, eficiente y elástica , de modo que pueda almacenar comentarios para diferentes tablas , me gusta para diferentes tablas y etiquetas para ellos. Algún patrón de diseño como respuesta será mejor;)
Descripción detallada : Tengo una tabla User
con algunos datos de usuario, y 3 tablas más : Photo
con fotografías , Articles
con artículos , Places
con lugares . Quiero habilitar a cualquier usuario registrado para:
comentar cualquiera de esas 3 tablas
marcar cualquiera de ellos como gustado
etiquetar cualquiera de ellos con alguna etiqueta
También quiero contar la cantidad de Me gusta para cada elemento y la cantidad de veces que se usó esa etiqueta en particular.
1 st enfoque :
a) Para las etiquetas , voy a crear una tabla Tag [TagId, tagName, tagCounter]
, a continuación, voy a crear muchos-a-muchos relaciones mesas para: Photo_has_tags
, Place_has_tag
, Article_has_tag
.
b) Lo mismo cuenta para los comentarios.
c) Voy a crear una tabla LikedPhotos [idUser, idPhoto]
, LikedArticles[idUser, idArticle]
, LikedPlace [idUser, idPlace]
. El número de Me gusta se calculará mediante consultas (lo cual, supongo que es malo). Y...
Realmente no me gusta este diseño para la última parte, me huele mal;)
2 nd enfoque :
Crearé una tabla ElementType [idType, TypeName == some table name]
que será rellenada por el administrador (yo) con los nombres de las tablas que pueden gustarse , comentarse o etiquetarse . Entonces crearé tablas :
a) LikedElement [idLike, idUser, idElementType, idLikedElement]
y lo mismo para Comentarios y Etiquetas con las columnas apropiadas para cada uno. Ahora, cuando quiera hacer una foto que me guste, insertaré:
typeId = SELECT id FROM ElementType WHERE TypeName == 'Photo'
INSERT (user id, typeId, photoId)
y para lugares:
typeId = SELECT id FROM ElementType WHERE TypeName == 'Place'
INSERT (user id, typeId, placeId)
y así sucesivamente ... Creo que el segundo enfoque es mejor, pero también siento que falta algo en este diseño también ...
Por último, también me pregunto cuál es el mejor lugar para almacenar el mostrador por cuántas veces le gustó el elemento. Solo puedo pensar en dos formas:
- en la
Photo/Article/Place
tabla element ( ) - por cuenta selecta ().
Espero que mi explicación del problema sea más exhaustiva ahora.