2012-08-17 79 views
1

我有一些分层数据(目前有6个级别)。每个级别都有不同的属性。在数据库中保存嵌套数据

我为每个级别添加了一个单独的表,并在每个表中为父级别添加了一个外键。但我不知道这是否正确。

Level1: id, ColA, ColB, ColC 
Level2: id, ColD, ColE, ColF, level1_Id 
Level3: id, ColG, ColH, level2_Id 
Level4: id, ColI, ColJ, ColK, ColL, level3_Id 
Level5: id, ColM, level4_Id 
Level6: id, ColN, ColO, level5_Id 

会有额外的时间。因此,设计必须灵活,以便我可以添加或删除一些层次。当然,表演必须保留。

我应该遵循哪种设计?

+0

的DB2版本的东西吗?最近的支持使用递归查询,它支持分层模型。此外,你的数据列是什么(它们在** intent **中有多不同,而不是数据类型)?这(逻辑)可以存储在一个表中吗?对于_known_(在设计时)层数,您的初始方法可能实际上正常工作。您可以稍后在表上运行更新,以添加/删除级别。 – 2012-08-17 15:27:31

+0

@ X-Zero我使用DB2 9.7。各级别不同,completeley不同。就我而言,将它们存放在平坦的桌子里不是一个好主意。 – Kayser 2012-08-17 15:31:01

+1

然后我可能会坚持你拥有的东西。如果你有一套已知的级别(就像你看起来那样),那么使用表结构来递归级别是不必要的。只有当你进入任意级别时,事情才会变得“有趣”。 – 2012-08-17 15:42:06

回答

1

恐怕这不是最好的方式,因为它不够灵活,无法给你无限的水平和性能。

此问题被称为“分层数据模型”,有几种实现方法。大多数可移植格式被称为“嵌套集”模型。其他模型包括Adjacency Model,以及Oracle和Microsoft的供应商特定模型。

这里是一个可以让你开始

http://www.evanpetersen.com/item/nested-sets.html http://www.sqlsummit.com/AdjacencyList.htm

+0

感谢您的回答。我正在尝试清除灵活性问题。如果我完全有6个级别,你会建议哪种设计? – Kayser 2012-08-17 13:31:33

+0

我仍然会建议嵌套集模型。你可能花费一两天的时间来使用它,但它是值得的a)你将学会解决这个问题,你会经常遇到b)你已经在系统中建立了灵活性。 – 2012-08-17 13:34:45

+0

删除和插入看起来像是一个真正的问题。你对此有何看法? – Kayser 2012-08-17 13:41:44