存储分层标签的最佳方式

时间:2011-06-14 14:45:17

标签: database-design language-agnostic architecture data-structures

我有一个列表,其中每个列表条目都标有多个标签。每个标签也可以有子标签。列表中的每个条目都可以有多个标签。

例如,谈论汽车的列表条目可以包含名为“汽车”,“车辆”,“法拉利”的标签。

我应该能够查看标签的层次结构,如下所示。此外,每个条目的标签数量应该没有限制,标签的深度也应该有限。

如何存储此数据?我愿意使用任何类型的DBMS。

enter image description here

6 个答案:

答案 0 :(得分:5)

天真的方法将是父/子解决方案,但使用此数据模型编写高效查询非常困难。

Managing Hierarchical Data in MySQL是关于分层数据结构的非常好的文章。我想其中大部分也可以应用于其他数据库系统。

答案 1 :(得分:4)

我认为这是任何数据库最简单的方法: tag (id, name, parent_id),其中parent_id引用父标记的id

答案 2 :(得分:1)

您正在使用2个数据源,但是,似乎您正在混合两者。

一个数据是您的列表条目,似乎是直线的,非分层的。

例如,电影列表。

另一个数据源,它是一个分层数据集合(“标签目录”)。

例如电影风格列表。

+---Styles
  +---Comedy
    +---KidsComedy
    +---SomeComedy
    +---LOLComedy
  +---Action
    +---SomeAction
    +---GrabYourCouchSofaAction
  +---Drama
    +---SomeDrama
    +---LotsOfTearsDrama
    +---EvenToughGuysWillCryDrama
  +---Horror
    +---SoftHorror
    +---HardHorror
    +---Gore
  +---SciFi

每部电影都可以与多种电影风格相关联:

  • “星球大战:幻影威胁”:{“SciFi”,“SomeDrama”,“SoftHorror”,“SomeAction”}
  • “StarTrek:First Contact”:{“SciFi”,SomeDrama“,”SomeComedy“}

在数据库设计方面,您应该至少拥有3个表或实体对象:

  • 列出条目= {ListEntryID,ListEntryTitle,...}
  • 电影类型标签/样式= {TagID,TagTitle,...}
  • 电影样式= {TagForListEntryID,ListEntryID,TagID,...}

祝你好运。

答案 3 :(得分:0)

使用XML格式,它将帮助您将节点存储为父节点和子节点 它可以有n个节点,易于形成和处理。 注意:以下只是一个示例,因此通过这种方式您可以处理数据。

<Menu>
  <Menuitem1>
      <submenu1>
         <submenu1>
            <submenu1.1/> 
          </submenu1>        
      </submenu1>
  </Menuitem1>

  <Menuitem1>
      <submenu1>
      </submenu1>
  </Menuitem1>
</Menu>

我认为这可能对你有帮助。

答案 4 :(得分:0)

这就是我解决问题的方法:首先,我将绘制一个域模型。在你的情况下,它看起来像:

List(1)----contains----(0..*)-->ListItem
ListItem(0..1)----hasTags--(0..*)-->Tag
Tag(0..1)-----hasSubTags---(0..*)-->Tag

这使问题显而易见,不容置疑。

现在,将其转换为数据模型。这非常简单:为每个关系引入合适的PrimaryKey-ForeignKey映射.Many-to-Many关系应该使用中间的新表分成两个1-M关系。

您在此阶段拥有的数据模型应该在功能上正确,但可能会出现性能问题。现在是时候专注于您想要的查询并相应地优化表结构。

(从领域模型开始的另一个类似的改进之旅将为您提供最终类模型的设计)

希望这种方法有所帮助。

答案 5 :(得分:0)

my answer here。我存储所有级别的父母 - 树木建筑和查询所有后代非常容易。