SQL表设计建议

时间:2010-08-11 14:27:30

标签: php sql

嘿,我想创建一个这样的列表。下面的图片不是我的列表,只是我想要创建的一个例子。

alt text http://i37.tinypic.com/bhes7m.jpg

我的类别表目前只是:

类别( id int, title varchar(20) )

我应该将所有内容保存在一个表中还是添加一个部分表来处理每个类别部分?

5 个答案:

答案 0 :(得分:2)

从我看到的内容(体育类别中的室内和室外子类别),您还需要在表格中parent_category_id

至于原来的问题,这取决于。我会单独使用不带分段的类别:这会使事情变得更加统一。

答案 1 :(得分:2)

我会在表中添加一个Parent_ID,该表链接到同一个表的ID字段,但是可以为NULL。然后,当您浏览PHP端的每个类别时,查找Parent_ID = $ current_id的子类别。要获取根类别(最上面的),请查找Parent_ID = NULL的那些。

这样你就可以在PHP端进行递归循环。

以下是关于如何制作递归函数的粗略概念。

function showCategories($parent_id = 0, $level = 0) {
    // If $parent_id == 0, look up categories with Parent_ID = NULL, otherwise by $parent_id.
    // For each category, show link and run showCategories() with the category's ID as $parent_id.
    // Throw in ++$level as the level, and do --$level at the end of each iteration.
    // Use $level to indicate how deep down the tree you are.
}

注意:Parent_ID字段必须为NULL,否则您无法指出最顶层的类别,因为Parent_ID必须作为ID存在(假设您正确链接了表)。

希望它有所帮助!

答案 2 :(得分:2)

我认为答案是:这取决于。

如果您可能会随着时间的推移增加子类别的数量,那么您可以创建一个表,并按照建议使用parent_id,并且可能缓存树结构显示生成,因为您需要获取所有类别并构建在代码中更正树,或者使用sql调用进行一些递归。

如果你知道它永远不会超过x个子类别,你可以“硬编码”到表示root_categories,sub_categories,sub_sub_Categories(每个都有parent_id)的x个数量的表。

当然,您也可以在更改类别时预先生成树结构(如果您有一些方法可以移动它们等),这样您只有一个包含类别的平面表,并获取预生成的树当需要显示树或面包屑线索样式导航时。

此问题与解决线程论坛问题类似,因此您可能会考虑以顺畅的方式解决这个问题。

答案 3 :(得分:1)

也许您应该添加一个指向主类别的字段'subcategory_of',如果它是空的,您可以将其用作主类别

答案 4 :(得分:1)

像这样的东西

category( id int, title varchar(20) )
subcategory (id int, id_category int, title varchar(20) ) 

id_category将保留category.id

的值

或将具有父母和他的孩子的id的层次结构表,这样你将拥有无限的等级。

 category( id int, title varchar(20) )
 category_hierarchy(id_parent int, id_child int)