假设我有一个存储类别的类别表。它以嵌套集样式(左右值)实现。
category_id lft rgt
1 1 6
2 2 5
3 3 4
所以类别1是类别2的父类别。类别2是类别3的父类。因此它基本上是从根到叶的一条路径。
第1类的类别字段应由第2类继承,第2类又将由第3类继承
现在,为特定类别存储字段的最佳方法是什么?我的解决方案是创建另一个具有类别id外键和字段名的表。
category_id fieldname
1 field1
1 field2
2 field3
3 field4
我对这种方法的问题是,当获取类别3的字段时,我需要获取其父节点,父节点的父节点等等,直到我到达根节点,以便我可以继承它们的字段。这不是一个非常糟糕的解决方案,但我想知道当类别表非常大时这是否可行。
所以问题基本上是一个优化问题。这是最佳解决方案吗?
答案 0 :(得分:0)
我只是将这些数据保存在具有以下模式的表中:
类别ID ParentCategoryID 路径
所以你可以
1 0 1 \
然后
2 1 1 \ 2
然后
3 2 1 \ 2 \ 3
然后,您可以使用路径字段触发一个简单的查询,以获得直接的parentid或从根到叶获取所有层次结构
不同但简单的方法,自从过去4年以来一直为我工作而没有任何问题: - )
答案 1 :(得分:0)
您可以使用您拥有的架构执行此操作,但将两个表连接在一起。左/右嵌套结构的优点在于,在一个查询中,您可以提取有关整个层次结构的大量信息。
在您的实例中,您希望提取所有类别ID,其中'lft'等于或小于给定级别的层次结构的'lft'值,并将结果与字段中的类别ID字段相结合表
查询类似于: -
select table2.fieldname from table2 left join table1 on table1.category_id = table2.category_id where table1.lft <= [lft value for given level of hierarchy]
如果您只有类别ID,那么您也可以使用子选择提取lft值或将表连接回自身。