问题描述
|
我有一个列表,其中每个列表条目都标记有多个标签。每个标签也可以具有子标签。列表中的每个条目都可以有多个标签。
例如,谈论汽车的列表条目可以具有名为“汽车”,“车辆”,“法拉利”的标签。
我应该能够查看标签的层次结构,如下所示。同样,对每个条目的标签数量以及标签的深度也应该没有限制。
如何存储这些数据?我愿意使用任何类型的DBMS。
解决方法
天真的方法是父/子解决方案,但是用这种数据模型编写高效的查询非常困难。
在MySQL中管理分层数据是一篇有关分层数据结构的不错的文章。我想大多数都可以应用于其他数据库系统。
, 我认为这是任何数据库的最简单方法:
tag (id,name,parent_id)
,其中parent_id
是指父标记的id
。
, 您正在使用2个数据源,但似乎您正在混用这两种数据。
一种数据是您的列表条目,这似乎是线性的,非分层的。
例如,电影列表。
另一个数据源,它是分层数据的集合(\“ tags catalog \”)。
例如电影样式列表。
+-样式
+ ---喜剧
+ ---儿童喜剧
+ --- SomeComedy
+ --- LOLComedy
+ ---动作
+ --- SomeAction
+ --- GrabYourCouchSofaAction
+-戏剧
+ ---有些戏剧
+ ---很多眼泪戏剧
+ ---甚至强壮的家伙会哭泣的戏剧
+ ---恐怖
+-软恐怖
+-硬恐怖
+-戈尔
+ ---科幻
每部电影可以与多种电影样式相关联:
\“ StarWars:The Phantom Menace \”:{\“ SciFi,\” SomeDrama \“,\” SoftHorror \“,\” SomeAction \“}
\“ StarTrek:第一联系人\”:{\“ SciFi,\” SomeDrama \“,\” SomeComedy \“}
在数据库设计方面,您应该拥有至少3个表或实体对象:
列表条目= {ListEntryID,ListEntryTitle,...}
电影流派标签/样式= {TagID,TagTitle,...}
电影的样式= {TagForListEntryID,ListEntryID,TagID,...}
祝好运。
, 使用XML格式,这将帮助您将节点存储为父级和子级
它可以具有n个节点,并且易于形成和处理。
注意:下面仅是一个示例,因此通过这种方式您可以处理数据。
<Menu>
<Menuitem1>
<submenu1>
<submenu1>
<submenu1.1/>
</submenu1>
</submenu1>
</Menuitem1>
<Menuitem1>
<submenu1>
</submenu1>
</Menuitem1>
</Menu>
我认为这可能对您有帮助。
, 这是解决问题的方法:首先,我将绘制一个领域模型。在您的情况下,它看起来像:
List(1)----contains----(0..*)-->ListItem
ListItem(0..1)----hasTags--(0..*)-->Tag
Tag(0..1)-----hasSubTags---(0..*)-->Tag
这使问题很明确,不容置疑。
现在,将其转换为数据模型。这非常简单:为每个关系引入合适的PrimaryKey-ForeignKey映射,应使用两者之间的新表将许多对许多关系拆分为两个1-M关系。
您在此阶段拥有的数据模型应该在功能上是正确的,但是可能存在性能问题。现在是时候专注于所需的查询并相应地优化表结构了。
(从领域模型开始的另一次类似的优化旅行也将为您提供最终类模型的设计)
希望这种方法有所帮助。
, 在这里查看我的答案。我存储所有级别的父母-树构建和查询所有后代非常容易。