【问题标题】:SQL Database Design, recursive parent-child relationship?SQL数据库设计,递归父子关系?
【发布时间】:2014-10-24 09:49:35
【问题描述】:

我想在 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 可以为空。

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

【问题讨论】:

  • 由于 MySQL 的 SQL 功能有限,我不会在 MySQL 中那样做。由于缺少递归查询,您将很难从该层次结构中检索数据。搜索“嵌套集模型”以获得可以用 MySQL 实现的不同设计

标签: mysql sql hierarchical-data recursive-query


【解决方案1】:

这取决于您希望如何使用您的数据,以及您是否希望使用查询而不是更新和插入。 您的解决方案称为相邻列表模型,使您的数据非常容易插入或更新。如果您有无限深度的同级,查询可能会很复杂,但同样,这取决于您计划如何使用此数据结构。如果您只想显示一个节点的所有兄弟姐妹,那没关系。另一方面,如果您想显示整个树的开发并在一个查询中执行此操作,那么您会很头疼。

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

  1. 欧洲 1.1 法国 1.1.1 巴黎 1.1.2 马赛
  2. 美国 2.1 美利坚合众国 2.1.1 华盛顿

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 关于树和层次结构的书

【讨论】:

    猜你喜欢
    • 2013-12-24
    • 2017-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-05
    • 1970-01-01
    相关资源
    最近更新 更多