Sou desenvolvedor de software. Adoro codificar, mas odeio bancos de dados ... Atualmente, estou criando um site no qual um usuário poderá marcar uma entidade como curtida (como no FB), marcá- la e comentar .
Fico preso no design de tabelas de banco de dados para lidar com essa funcionalidade. A solução é trivial, se pudermos fazer isso apenas para um tipo de coisa (por exemplo, fotos). Mas preciso habilitar isso para cinco coisas diferentes (por enquanto, mas também presumo que esse número possa crescer à medida que o serviço inteiro cresce).
Encontrei algumas perguntas semelhantes aqui, mas nenhuma delas tem uma resposta satisfatória, por isso estou fazendo essa pergunta novamente.
A questão é: como projetar o banco de dados de maneira adequada, eficiente e elástica , para que ele possa armazenar comentários para tabelas diferentes , curtidas para tabelas e tags diferentes para elas. Algum padrão de design como resposta será melhor;)
Descrição detalhada : Eu tenho uma tabela User
com alguns dados do usuário e mais 3 tabelas : Photo
com fotografias , Articles
com artigos , Places
com lugares . Quero habilitar qualquer usuário logado para:
comentar em qualquer uma dessas 3 tabelas
marque qualquer um deles como desejado
marcar qualquer um deles com alguma tag
Também quero contar o número de curtidas para cada elemento e o número de vezes que essa tag específica foi usada.
1 r abordagem :
a) Para as tags , vou criar uma tabela Tag [TagId, tagName, tagCounter]
, então eu vou criar muitos-para-muitos relacionamentos mesas para: Photo_has_tags
, Place_has_tag
, Article_has_tag
.
b) O mesmo vale para comentários.
c) I irá criar uma tabela LikedPhotos [idUser, idPhoto]
, LikedArticles[idUser, idArticle]
, LikedPlace [idUser, idPlace]
. O número de curtidas será calculado por consultas (que, suponho, são ruins). E...
Eu realmente não gosto deste design para a última parte, ele cheira muito mal para mim;)
2 nd abordagem :
Vou criar uma tabela ElementType [idType, TypeName == some table name]
que será preenchida pelo administrador (eu) com os nomes das tabelas que podem ser curtidas , comentadas ou marcadas . Então eu vou criar tabelas :
a) LikedElement [idLike, idUser, idElementType, idLikedElement]
e o mesmo para Comentários e Tags com as colunas apropriadas para cada um. Agora, quando eu quiser fazer uma foto curtida, inserirei:
typeId = SELECT id FROM ElementType WHERE TypeName == 'Photo'
INSERT (user id, typeId, photoId)
e para lugares:
typeId = SELECT id FROM ElementType WHERE TypeName == 'Place'
INSERT (user id, typeId, placeId)
e assim por diante ... Acho que a segunda abordagem é melhor, mas também sinto que algo está faltando nesse design ...
Por fim, também me pergunto qual é o melhor local para armazenar o contador quantas vezes o elemento foi curtido. Só consigo pensar em duas maneiras:
- na
Photo/Article/Place
tabela element ( ) - por contar count ().
Espero que minha explicação sobre o assunto seja mais completa agora.