SQL数据库设计,递归父子关系?

时间:2014-08-30 16:01:11

标签: mysql sql hierarchical-data recursive-query

我想在MySQL数据库中表示递归的父子关系。我想创建category - subcategory关系。一个类别可以有N个子类别,每个子类别可以有N个子类别,依此类推。我想的是有一个category表,外键指向它自己。这就是我的意思:

CREATE TABLE `category` (
  `id` int NOT NULL AUTO_INCREMENT,
  `name` varchar(50) NOT NULL,
  `parent_category` int NULL,
  PRIMARY KEY (`id`),
  FOREIGN KEY (`parent_category`) REFERENCES `category` (`id`)
)
如果某个类别是顶级类别,则

parent_category可以为null。

这是表示这样的关系的正确方法吗?在我的设计中我还应该考虑其他一些事情(性能,查询......)?

1 个答案:

答案 0 :(得分:4)

这取决于您希望如何使用数据,而您希望通过更新和插入来支持查询。 您的解决方案称为相邻列表模型,使您可以非常轻松地插入或更新数据。如果您拥有无限深度的兄弟姐妹,查询可能会很复杂,但这又取决于您计划如何使用此数据结构。如果你想要的只是显示一个节点的所有兄弟,那就没问题。另一方面,如果你想显示整个树的开发并在一个查询中执行此操作,那么你就会感到头痛。

另一种解决方案是使用表示层次结构的连接字符串。 例如:

  1. 欧洲 1.1法国 1.1.1巴黎 1.1.2马赛
  2. 美 2.1美利坚合众国 2.1.1华盛顿
  3. DDL将是这样的:

       CREATE TABLE `category` (
      `id` int NOT NULL AUTO_INCREMENT,
      `name` varchar(50) NOT NULL,
      `link` varchar(30) NOT NULL DEFAULT '.',
      PRIMARY KEY (`id`),
    )
    

    此数据结构使您的查询更容易,但更新速度更慢

    另一个解决方案是嵌套集模型,您可以在其中注册当前节点右侧和左侧的节点的ID。它是查询的最有效结构,但使插入和更新更难。

    http://en.wikipedia.org/wiki/Nested_set_model

    我推荐Joe Celko关于树木和层次结构的书