Projeto de banco de dados para sistema de marcação

5

Estou criando um sistema no qual os itens terão uma ou mais tags.

Agora haverá uma tabela item que armazenará cada item e uma tabela tags , que armazenará todas as tags usadas no sistema.

A minha pergunta é: Qual é o melhor design que posso ter para me permitir vincular itens às suas respectivas tags e registrar quantas vezes um item recebeu uma tag específica de um usuário?

Por exemplo, estou pensando se devo criar uma terceira tabela que associe um item específico a uma determinada tag e quantas vezes essa tag foi selecionada. Os campos seriam assim: item_id, tag_id, tag_hits - onde tag_hits é o número de vezes que a tag foi usada. Essas soluções associariam todos os itens com suas tags em uma única tabela.

Ou a outra solução em que estou pensando é criar uma tabela para cada item e registrar cada tag e a quantia de tempo em que a tag foi usada. Então, para o itemX eu criaria uma tabela itemX e os campos seriam: tag_id, tag_hits. Para outro itemY, eu criaria uma tabela chamada itemY com os mesmos campos. Então, para cada item, haveria uma tabela associando-a com suas tags. Agora, pode haver centenas de milhares de itens nesse sistema.

Suponho que os desenvolvedores deste site tenham que fazer considerações semelhantes, pois cada pergunta é marcada. E você pode procurar perguntas por tag. Meu sistema terá uma funcionalidade semelhante.

Alguém pode recomendar uma solução de design, levando em consideração tudo o que eu disse, e a consideração de desempenho. Por favor, indique onde você acha que a indexação pode ajudar também. Eu uso bancos de dados SQL no meu desenvolvimento, mas se você acha que uma solução no-SQL faria isso, por favor sugira um design ao longo destas linhas. por favor, seja muito específico.

Obrigado Ron

    
por Ron 09.10.2011 / 20:01
fonte

1 resposta

5

Siga sua primeira abordagem, é basicamente a maneira padrão de modelar esse tipo de relacionamento. (atualizado para registrar usuário que adicionou a tag)

Itens
ItemID (PK)

ItemTags
ItemID (FK)
TagID (FK)

Tags
TagID (PK)

UserTags
ItemID (FK)
UserID (FK)

Você também pode fazer isso adicionando uma coluna UserID à tabela ItemTags e permitindo linhas duplicadas para cada tag, mas a abordagem acima provavelmente terá melhor desempenho.

A segunda abordagem parece ser uma má ideia, já que não lhe daria a flexibilidade de adicionar mais tags no futuro e provavelmente tornaria as consultas mais difíceis de serem escritas.

Quanto à indexação: indexe cada uma das chaves estrangeiras (as chaves primárias devem ser indexadas automaticamente).

Usar um RDBMS, uma solução NO-SQL, provavelmente não traria nenhum benefício para esse tipo de estrutura de dados.

Independentemente do que você fizer, evite criar campos de vários valores com algum tipo de valores delimitados por vírgula ou espaço. É um matador de desempenho e torna as consultas realmente difíceis de escrever.

    
por 09.10.2011 / 20:48
fonte