5

我只是在学习如何实现嵌套集模型,但仍然对涉及可能是多个类别的一部分的项目的某个方面存在混淆。下面给出的例子来自HERE拉,反映出许多其他的例子,我所遇到的...分层数据 - 嵌套集模型:MySql

Hierarchical Data: Numbered Tree

Table

你如何避免重复在DB当您添加苹果,因为它们是多色(即红色,黄色,绿色)?

回答

5

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

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

干杯!

+0

是的,我一直在寻找一个答案,但无法找到任何明确的主题。我在这个时候使用MySQL,所以将来会遇到转换为非免费数据库的问题,并重复Apple?或者我应该尝试并通过不允许多个父母来解决这个问题,而只是使用嵌套集方法?还是有另一种方法来解决这个问题利用MySQL? – swisscheese 2011-03-20 12:25:15

+0

至少在Oracle的情况下,你不会遇到任何问题。嵌套集方法非常便于使用,因为它使用标准的SQL结构。在一般情况下,我看不到苹果_reference_的重复。尽管我很熟悉它,但从未在实践中使用嵌套集。但是我会更关心树的修改(添加/删除/移动节点)。他们通常比较慢。另外请注意,这不是标准技术,您的解决方案的维护人员可能需要一个艰难的开始。 – 2011-03-20 13:26:02

+0

感谢您对此问题的帮助。如果你有机会,并且愿意,你可以请看看我的问题,以此http://stackoverflow.com/questions/5395463/data-modeling-modeling-categories-subcategories-in-mysql – swisscheese 2011-03-22 19:04:54

3

嵌套集模型是1:N(一对多)关系的结构,您想使用M:N(多对多)关系(许多项目可以有苹果作为父项,但可以有多个一位父母)。

See this article

Wikipedia

但是你应该知道,该分级M:N的关系可以得到相当复杂的真快!

+0

是的,我理解这个概念,但不适用于嵌套集模型。所以这是我的问题,嵌套集模型可以处理这个问题,如果是的话如何? – swisscheese 2011-03-20 12:07:41

+0

@swisscheese它不能以任何简单的方式。也许你可以尝试只保存树中的引用(指向不同的表的数据项的ID)。但我不认为嵌套集合模型真的适合这个。 – 2011-03-20 12:12:09

3

在这里大声思考,但也许这将有助于查看一些属性(如红色,黄色和绿色)作为'标记'而不是'类别',并用单独的逻辑处理它们。这将让你保持嵌套集模型,并避免不必要的重复。另外,它可以让你保持你的类别更简单。

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

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

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

+0

我有同样的思考,不知道我是否错过了一些可能的后果,但将颜色看作标签还是有道理的。 – johnsnails 2014-01-09 03:57:51

0

旧的线程,但我发现这个问题的更好的答案。

由于苹果可以有不同的颜色,你的结构是一个图形,而不是一棵树。嵌套集合模型不是适合的结构。

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