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