Chr*_*tis 5 mysql sql recursive-query hierarchical-data
我想在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`)
)
Run Code Online (Sandbox Code Playgroud)
parent_category
如果类别是顶级类别,则可以为null.
这是表示这样的关系的正确方法吗?在我的设计(性能,查询......)中还应该考虑其他事项吗?
这取决于您希望如何使用您的数据,以及您是否希望通过更新和插入来支持查询。您的解决方案称为相邻列表模型,使您可以轻松插入或更新数据。如果您有无限深度的兄弟姐妹,查询可能会很复杂,但同样,这取决于您计划如何使用此数据结构。如果您唯一想要的是显示一个节点的所有兄弟节点,这是可以的。另一方面,如果您想显示开发的整个树并在一个查询中执行此操作,您会很头疼。
另一种解决方案是使用表示层次结构的连接字符串。例如 :
DDL 将是这样的:
CREATE TABLE `category` (
`id` int NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL,
`link` varchar(30) NOT NULL DEFAULT '.',
PRIMARY KEY (`id`),
)
Run Code Online (Sandbox Code Playgroud)
这种数据结构使您的查询更容易,但更新速度较慢
另一种解决方案是嵌套集模型,您可以在其中注册当前节点左右两侧的节点的 id。它是最有效的查询结构,但会使插入和更新变得更加困难。
http://en.wikipedia.org/wiki/Nested_set_model
我向你推荐 Joe Celko 的关于树和层次结构的书