Database 具有较深子级别的树状子类别表的数据库建模

Database 具有较深子级别的树状子类别表的数据库建模,database,Database,对于如何将以下需求转换为数据库表存在疑问。需求中有更深层次的子分类,这些子分类非常动态。 以下示例将解释我的要求: 类别--> 未来可能会有更多更深层次的子项。如何进行分类以使数据库变得动态。您可以使用以下工具来完成此操作: ID Name ParentID 所以ParentID为零将是最高级别。从那以后,它可以永远继续下去。我使用分层存储来构建我的作品弹出式菜单的结构,类似于您正在寻找的内容。表格结构如下: CREATE TABLE IF NOT EXISTS `page_menu` (

对于如何将以下需求转换为数据库表存在疑问。需求中有更深层次的子分类,这些子分类非常动态。 以下示例将解释我的要求:

类别-->

未来可能会有更多更深层次的子项。如何进行分类以使数据库变得动态。

您可以使用以下工具来完成此操作:

ID 
Name 
ParentID

所以ParentID为零将是最高级别。从那以后,它可以永远继续下去。

我使用分层存储来构建我的作品弹出式菜单的结构,类似于您正在寻找的内容。表格结构如下:

CREATE TABLE IF NOT EXISTS `page_menu` (
  `menu_id` int(5) NOT NULL AUTO_INCREMENT,
  `menu_parent` int(5) DEFAULT NULL,
  `menu_sibling` int(5) DEFAULT NULL,
  `lang` char(2) NOT NULL,
  `url_id` int(10) NOT NULL,      
  PRIMARY KEY (`menu_id`),
  KEY `menu_parent` (`menu_parent`),
  KEY `menu_sibling` (`menu_sibling`),
  KEY `url_id` (`url_id`),
  KEY `lang` (`lang`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;

ALTER TABLE `page_menu`
  ADD CONSTRAINT `page_menu_ibfk_1` FOREIGN KEY (`menu_parent`) REFERENCES `page_menu` (`menu_id`) ON DELETE SET NULL ON UPDATE CASCADE,
  ADD CONSTRAINT `page_menu_ibfk_2` FOREIGN KEY (`menu_sibling`) REFERENCES `page_menu` (`menu_id`) ON DELETE SET NULL ON UPDATE CASCADE,
  ADD CONSTRAINT `page_menu_ibfk_3` FOREIGN KEY (`url_id`) REFERENCES `page_desc` (`url_id`) ON DELETE CASCADE ON UPDATE CASCADE,
  ADD CONSTRAINT `page_menu_ibfk_4` FOREIGN KEY (`lang`) REFERENCES `lang` (`lang`) ON DELETE CASCADE ON UPDATE CASCADE;
因此,基本上每个记录都有自己的唯一id(menu_id),并且还列出了可选的父项(根元素为NULL)和可选的较老的同级项(最老的同级项也为NULL),这两个都是menu_id主键列的外键,以强制执行与其他现有菜单元素关联的菜单元素,最后是url本身的语言和id,链接到其他表,这些表保存页面的每个语言版本的页面数据

因此,虽然行看起来像这样:

其结构如下:

<ul>
    <li>1</li>
    <li>11
        <ul>
            <li>61
                <ul>
                    <li>111</li>
                    <li>121</li>
                </ul>
            </li>
            <li>71</li>
        </ul>
    </li>
    <li>21</li>
    <li>31</li>
    <li>41</li>
    <li>51</li>
</ul>
  • 一,
  • 十一,
    • 61
      • 111
      • 121
    • 七十一
  • 二十一,
  • 三十一
  • 41
  • 五十一

这种方法的缺点是不能单独使用SQL来提取树,在可以轻松地重建树之前,需要进行一些处理才能按正确的顺序对记录进行排序。基本上,您必须循环遍历结果以将其重新排序到树的展开版本中,然后才能反向遍历它,将子级附加到父级。。虽然速度不是非常慢,但也不是很快,因此对于无法静态缓存到文件中的复杂树,它可能不是一种合适的方法。但对于偶尔重新创建弹出式菜单的嵌套结构(保存为html包含文件)这样的简单操作,它非常有用。

您应该阅读层次数据库建模。这个链接有一些关于各种方法的好的基本信息。只有当我们知道有多少更深层次时,上面的解决方案才有效。在上述情况下,更深层次的数量是动态的,以前不知道。@GaneshYoganand,这是动态的。{ParentID=0,ID=100},{ParentID=100,ID=233},{ParentID=233,ID=834},{ParentID=834,ID=1234}。这是4个级别,可以动态构建。明白了J Brooks,你的答案真的很棒,非常感谢你耐心的解释。
<ul>
    <li>1</li>
    <li>11
        <ul>
            <li>61
                <ul>
                    <li>111</li>
                    <li>121</li>
                </ul>
            </li>
            <li>71</li>
        </ul>
    </li>
    <li>21</li>
    <li>31</li>
    <li>41</li>
    <li>51</li>
</ul>