【问题标题】:Explain db tag storage method讲解db标签存储方式
【发布时间】:2010-10-01 18:15:45
【问题描述】:

来自这篇帖子What is the most efficient way to store tags in a database?

建议这样存储标签表。

Table: Item
Columns: ItemID, Title, Content

Table: Tag
Columns: TagID, Title

Table: ItemTag
Columns: ItemID, TagID

另一个 SO 帖子也说了同样的话。谁能解释为什么标签应该这样存储? 我猜 ItemID 是一些内部 val,title 是标签名称(c++、sql、noob 等) 内容是我想与我的项目一起存储的任何其他数据。 为什么不喜欢

Table: Item
Columns: ItemID, Title, <more data i want>

Table: TagList
Columns: ItemID, Title

项目中的标题为“项目名称”,标签标题为“c++”“sql”“noob”“etc”

【问题讨论】:

    标签: database database-design tags


    【解决方案1】:

    为什么?已经正常化了。 ItemID 将是主键(可能是代理项或身份),TagID 几乎可以肯定是代理项/身份,并且对于约束/性能,您将拥有唯一的约束和/或索引(甚至可能聚集在 tag.title 上)。

    在您的示例中,TagList 将没有主键(除非两列都是主键),并且无法对其进行规范化以删除标签标题冗余(具有相同标签的两个项目将具有单独的条目)。此外,由于标签在第二个模型中本身并不是实体,因此它们无法通过另一个 ItemTag 表链接到不同类型的实体。

    【讨论】:

      【解决方案2】:

      您展示的第二种设计没有任何问题,即带有TagList 表的设计,只是它占用了更多空间。

      也就是说,如果您使用标签“database-design”标记 10,000 个项目,那么在双表设计中,您必须存储该字符串 10,000 次。如果空间效率更重要,您可以使用三表设计,它只会存储“database-design”10,000 次的 4 字节整数 ID。节省 10 * 10,000 字节。

      另一个区别是,在三表设计中,Tag 表中可以有多个具有相同字符串的行,即使它们具有不同的整数 ID 值。所以在ItemTag 表中,它们看起来是不同的标签,而您永远不会知道它们实际上被类似地标记了。而在双表设计中,具有相同拼写的标签会隐式组合在一起。

      还有一点:如果你需要改变标签的拼写,那么在两表设计中你必须更新很多行。三表设计中,只需要更新一行即可。

      最后,如果您通常需要唯一标签列表,在三表设计中查询Tags 表会更快,而不是每次需要唯一标签时都需要SELECT DISTINCT tag FROM TagList。后者只给你一个标签列表正在使用,而不是所有合格标签的列表。

      【讨论】:

      • 谢谢!我想脚注是,两种方式都是合法的,各有各的优势。根据您需要提高效率的部件来选择设计。 IE。这取决于您的特定应用程序需要如何使用数据。
      猜你喜欢
      • 1970-01-01
      • 2011-09-14
      • 2012-05-10
      • 2019-11-28
      • 2013-01-03
      • 2011-04-02
      • 1970-01-01
      • 1970-01-01
      • 2015-12-21
      相关资源
      最近更新 更多