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



我想在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. 欧洲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(关于树木和等级制度的书

相关内容

  • 没有找到相关文章

最新更新