分层数据 - 嵌套集模型:MySql

时间:2011-03-20 11:51:31

标签: mysql database database-design relational-database database-schema

我只是学习如何实现嵌套集模型,但仍然对其涉及可能属于多个类别的项目的某个方面感到困惑。鉴于下面的示例是从HERE中提取的,并且反映了我遇到的许多其他示例......

Hierarchical Data: Numbered Tree

Table

当您添加苹果时,如何避免数据库中的重复,因为它们是多色的(即红色,黄色,绿色)?

4 个答案:

答案 0 :(得分:5)

您不会避免重复,苹果(或对苹果的引用)将在您的树中放置两次,否则它将不是树而是图形。如果您构建一个... Swing JTree或HTML树,您的问题同样适用;)。

嵌套集模型只是在关系数据库中推送和遍历树结构的有效方式。它本身不是数据结构。它在MySQL用户中更受欢迎,因为MySQL缺乏处理树结构的功能(例如Oracle提供的功能)。

干杯!

答案 1 :(得分:3)

嵌套集模型是1:N(一对多)关系的结构,您希望使用M:N(多对多)关系(许多项目可以将apple作为父级,但可以有多个亲本)。

See this article

Wikipedia

但你应该知道,分层的M:N关系可以非常快速地变得非常复杂!

答案 2 :(得分:3)

在这里大声思考,但也许将某些属性(如红色,黄色和绿色)视为“标签”而不是“类别”并使用单独的逻辑处理它们会很有帮助。这样可以保留嵌套集模型并避免不必要的重复。此外,它可以让您更简单地保持您的类别。

这就是你如何看待这些信息。类别只是表示属性的另一种方式。我知道你的例子只是为了说明目的,但是如果你要按颜色对水果进行分类,你为什么不以同样的方式对肉类进行分类,即白肉和红肉?很可能你不会。所以我的观点是,可能没有必要按颜色对水果进行分类。

相反,某些属性可以通过其他方式更好地表示。事实上,在最简单的形式中,它可以被记录为标有“颜色”的“食物”表中的一列。或者,如果它是一个非常常见的属性,并且您发现自己重复显示该值,则可以将其拆分为名为“color”的单独表格,并映射到第三个表格中的每个食物项目。当然,更抽象的方法是将表格概括为“标签”,并将每种颜色包含为单个标签,然后可以将其映射到任何食品。然后,您可以将任意数量的标签(颜色)映射到任意数量的食品,为您提供真正的多对多关系,并释放您的类别名称,以便更加通用。

我知道关于标签是类别还是类别是标签等问题一直在争论,但这似乎是一个可以互补的实例,并创建一个更易于管理的更抽象,更健壮的系统。

答案 3 :(得分:0)

旧线程,但我找到了更好的答案。

由于苹果可以有不同的颜色,因此您的结构是图形,而不是树。嵌套集模型不是正确的结构。

由于您在评论中提到您正在使用Mysql,更好的解决方案是使用Open Query Graph引擎(http://openquery.com/graph/doc),这是一个mysql插件,可以让您创建一个特殊的表,您可以在其中放置关系,基本上是parentId和childId。 神奇的是,您使用特殊的列锁存器查询此表,具体取决于查询中传递的值将告诉OQGRAPH引擎执行哪个命令。有关详细信息,请参阅文档。