如何在MySQL中存储类别特定字段?

时间:2011-01-05 09:19:37

标签: mysql optimization categories

假设我有一个存储类别的类别表。它以嵌套集样式(左右值)实现。

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的字段时,我需要获取其父节点,父节点的父节点等等,直到我到达根节点,以便我可以继承它们的字段。这不是一个非常糟糕的解决方案,但我想知道当类别表非常大时这是否可行。

所以问题基本上是一个优化问题。这是最佳解决方案吗?

2 个答案:

答案 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值或将表连接回自身。