Estou implementando um sistema de marcação no meu site semelhante ao que um stackoverflow usa, minha pergunta é: qual é a maneira mais eficaz de armazenar tags para que possam ser pesquisadas e filtradas?
Minha ideia é esta:
Table: Items
Columns: Item_ID, Title, Content
Table: Tags
Columns: Title, Item_ID
Isso é muito lento? Existe uma maneira melhor?
database
database-design
tags
tagging
Logan Serman
fonte
fonte
Respostas:
Um item terá muitas tags. E uma tag pertencerá a muitos itens. Isso implica para mim que você possivelmente precisará de uma tabela intermediária para superar o obstáculo de muitos para muitos.
Algo como:
Pode ser que seu aplicativo da Web seja incrivelmente popular e precise desnormalizar mais adiante, mas é inútil enlamear as águas muito cedo.
fonte
Você deve ler as postagens do blog de Philipp Keller sobre a marcação de esquemas de banco de dados. Ele tenta alguns e relata seus resultados, tanto em termos de facilidade na construção de consultas comuns quanto em termos de desempenho . Número de tags, número de itens marcados e número de tags por item foram todos fatores. Os posts são de 2005; Não tenho conhecimento de nenhuma atualização desde então.
fonte
Na verdade, acredito que des-normalizar a tabela de tags pode ser um caminho melhor a seguir, dependendo da escala.
Dessa forma, a tabela de tags simplesmente possui tagid, itemid, tagname.
Você receberá nomes de tag duplicados, mas isso facilita a adição / remoção / edição de tags de itens específicos. Você não precisa criar uma nova tag, remover a alocação da antiga e realocar uma nova, basta editar o nome da tag.
Para exibir uma lista de tags, basta usar DISTINCT ou GROUP BY e, é claro, você pode contar quantas vezes uma tag também é usada com facilidade.
fonte
Se você não se importa em usar um pouco de coisas não padronizadas, o Postgres versão 9.4 e posterior tem a opção de armazenar um registro do tipo de matriz de texto JSON.
Seu esquema seria:
Para obter mais informações, consulte este excelente post de Josh Berkus: http://www.databasesoup.com/2015/01/tag-all-things.html
Existem várias opções comparadas minuciosamente para desempenho e a sugerida acima é a melhor em geral.
fonte
Eu sugiro usar a terceira tabela intermediária para armazenar associações de itens de tags <=>, uma vez que temos relações muitos-para-muitos entre tags e itens, ou seja, um item pode ser associado a várias tags e uma tag pode ser associada a vários itens. HTH, válvula.
fonte
Você não pode realmente falar sobre lentidão com base nos dados que você forneceu em uma pergunta. E não acho que você deva se preocupar muito com o desempenho nesse estágio de desenvolvimento. Isso se chama otimização prematura .
No entanto, sugiro que você inclua a coluna Tag_ID na tabela Tags. Geralmente, é uma boa prática que todas as tabelas tenham uma coluna de ID.
fonte
Se o espaço for um problema, tenha uma terceira tabela de Tags (Tag_Id, Title) para armazenar o texto da tag e altere a tabela de Tags para (Tag_Id, Item_Id). Esses dois valores também devem fornecer uma chave primária composta exclusiva.
fonte
Os itens devem ter um campo "ID" e os Tags devem ter um campo "ID" (Chave Primária, Clusterizada).
Em seguida, faça uma tabela intermediária de ItemID / TagID e coloque o " Índice Perfeito " lá.
fonte