首页 / 知识
推荐的用于标记或标记的SQL数据库设计
2023-04-12 19:17:00

Recommended SQL database design for tags or tagging我听说过几种实施标记的方法; 使用TagID和ItemID之间的映射表(对我来说有意义,但是可以缩放吗?),向ItemID添加固定数量的可能的TagID列(似乎是个坏主意),将标签保持在逗号分隔的文本列中(声音 疯狂但可以工作)。 我什至听说有人建议使用稀疏矩阵,但是标签名称又如何优雅地增长呢? 我是否错过了标签的最佳做法? 三个表(一个用于存储所有项目,一个用于所有标签,一个用于两者之间的关系)已正确索引,并且在适当的数据库上运行了外键,这些表应该可以正常工作并可以适当扩展。
通常,我会同意Yaakov Ellis的观点,但是在这种特殊情况下,还有另一个可行的解决方案: 使用两个表:
这具有一些主要优点:
首先,它使开发变得更加简单:在用于
然后,它使查询更简单(也许更快)。您将执行三个主要的数据库查询:输出所有 一个项目的所有标签: 3桌:
2表:
标签云: 3桌:
2表:
一个标签的项目: 3桌:
2表:
但是也有一些缺点:它可能会占用数据库中更多的空间(这可能会导致更多的磁盘操作,速度变慢),并且未规范化这可能会导致不一致。 size参数不是很强,因为标签的本质是标签通常很小,因此尺寸增加不是很大。有人可能会说,在一个只包含每个标签一次的小表中,对标签标题的查询要快得多,这当然是正确的。但是考虑到不必加入而节省下来的钱,以及可以在它们上建立良好索引的事实,很容易就能弥补这一点。当然,这在很大程度上取决于您所使用的数据库的大小。 不一致的论点也有一点争议。标签是自由文本字段,没有预期的操作,例如"将所有标签" foo"重命名为" bar""。 tldr:我会寻求两张桌子的解决方案。 (实际上,我要去。我找到了这篇文章,以查看是否有反对它的有效论点。) 如果您使用的是支持map-reduce的数据库(例如,couchdb),则将标签存储在纯文本字段或列表字段中确实是最好的方法。例:
使用group = true运行此命令将按标签名称对结果进行分组,甚至返回遇到该标签的次数的计数。这与计算文本中单词的出现非常相似。 使用单个格式化的文本列[1]来存储标签,并使用功能强大的全文本搜索引擎对此进行索引。否则,在尝试实现布尔查询时,您将遇到扩展问题。 如果需要有关标签的详细信息,则可以在增量维护的表中跟踪它,也可以运行批处理作业以提取信息。 [1]一些RDBMS甚至提供了本机数组类型,由于不需要解析步骤,它甚至可能更适合存储,但是可能会导致全文搜索出现问题。 我一直将标签放在单独的表中,然后有一个映射表。当然,我也从来没有做过任何大规模的事情。 拥有一个"标签"表和一个映射表使得生成标签云变得相当简单,因为您可以轻松地将SQL组合在一起以获取一个标签列表,其中包含每个标签使用频率的计数。
我建议以下设计:
并行构建另一个表: 现在,在搜索标签商品时,它将会非常快。 |
最新内容
相关内容
python有map方法吗
python有map方法吗,培训,位置,数据,函数,列表,序列,参数,元素,方法,使用方法,python中的map:map()会根据提供的函数对指定序列做映射。第一个python有哪些推荐使用的装饰器?
python有哪些推荐使用的装饰器?,单位,时间,代码,标准,灵活,软件,数据,连续,培训,模块,众所周知,Python语言非常强大,有很多优点。值得一提的是,它python有哪些方法可以解压文件?
python有哪些方法可以解压文件?,工具,系统,工作,培训,文件,文件夹,方法,窗体,不同于,以下内容,在Python学习和日常使用中,很容易造成文件过大。python函数与方法的区别是什么
python函数与方法的区别是什么,培训,函数,方法,区别,对象,以上,方式,更多,内容,python中函数和方法的区别1、函数要手动传self,方法不用传selpython类自带方法吗
python类自带方法吗,培训,方法,里面,实例,也就是说,下面,对象,以上,之后,参数,python中的类,创建好之后,里面是没有方法的,也就是说,类并没有自带python子类可以调用父类方法吗
python子类可以调用父类方法吗,培训,名称,资料,情况,地方,函数,参数,方法,表示,语句,python中的子类中的__init__()函数会覆盖父类的函数,一些python静态方法怎么使用self
python静态方法怎么使用self,培训,管理,不了,方法,静态,属性,实例,变量,对象,参数,python-静态方法,类方法,属性方法静态方法实际上与类(或者实python怎么理解Python的构造方法
python怎么理解Python的构造方法,代码,名字,培训,方法,参数,对象,以上,结尾,函数,开头,在创建类时,我们可以手动添加一个__init__()方法,该方法python列表操作的函数和方法
python列表操作的函数和方法,培训,位置,列表,元素,操作,函数,末尾,方法,对象,以下,1列表操作包含以下函数:21、cmp(list1,list2):比较两个列表python怎么调用类方法
python怎么调用类方法,培训,方法,实例,静态,定义,参数,属性,对象,关键字,以上,python中的类用来描述具有相同的属性和方法的对象的集合。它定python判断字符串是否为小数的方法
python判断字符串是否为小数的方法,培训,代码,合法,小数点,小数,整数,字符串,方法,右边,左边,python想判断一个字符串是不是一个合法的小数,但python可以继承父类方法吗
python可以继承父类方法吗,培训,代码,名字,方法,动物,属性,编译器,这样的话,定义,里面,python继承,调用父类属性方法在python里面,继承一个类