推荐的用于标记或者标记的SQL数据库设计
时间:2020-03-05 18:41:44 来源:igfitidea点击:
我听说过几种实现标记的方法;使用TagID和ItemID之间的映射表(对我来说有意义,但是可以缩放吗?),向ItemID添加固定数量的可能的TagID列(似乎是个坏主意),将标签保持在逗号分隔的文本列中(声音疯狂但可以工作)。我什至听说有人建议使用稀疏矩阵,但是标记名称又如何优雅地增长呢?
我是否错过了标签的最佳做法?
解决方案
回答
三个表(一个用于存储所有项目,一个用于所有标签,一个用于两者之间的关系)已正确索引,并且在适当的数据库上运行了外键,这些表应该可以正常工作并可以适当扩展。
Table: Item Columns: ItemID, Title, Content Table: Tag Columns: TagID, Title Table: ItemTag Columns: ItemID, TagID
回答
我一直将标签保存在单独的表中,然后有一个映射表。当然,我也从来没有做过任何大规模的事情。
拥有一个"标签"表和一个映射表使得生成标签云变得相当简单,因为我们可以轻松地将SQL组合在一起以获取一个标签列表,其中包含每个标签使用频率的计数。
回答
使用单个格式化的文本列[1]来存储标签,并使用功能强大的全文本搜索引擎对此进行索引。否则,在尝试实现布尔查询时,我们将遇到扩展问题。
如果需要有关所拥有标签的详细信息,则可以在增量维护的表中对其进行跟踪,也可以运行批处理作业以提取信息。
[1]一些RDBMS甚至提供了本机数组类型,由于不需要解析步骤,因此甚至更适合存储,但是可能会导致全文搜索出现问题。
回答
如果我们使用的是支持map-reduce的数据库(例如,couchdb),则将标签存储在纯文本字段或者列表字段中确实是最好的方法。例子:
tagcloud: { map: function(doc){ for(tag in doc.tags){ emit(doc.tags[tag],1) } } reduce: function(keys,values){ return values.length } }
使用group = true运行此命令将按标签名称对结果分组,甚至返回遇到该标签的次数的计数。这与计算文本中单词的出现非常相似。