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

mysql–SQL数据库设计,递归父子关系?,第1张

概述我想在MySQL数据库中表示递归父子关系.我想创建一个category-subcategory关系.一个类别可以有N个子类别,每个子类别可以有N个子类别,依此类推.我想的是有一个单独的类别表,外键指向它自己.这就是我的意思:CREATE TABLE `category` ( `id` int NOT NULL AUTO_INCREMENT, `na

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

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,`link` varchar(30) NOT NulL DEFAulT '.',)

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

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

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

我推荐你Joe Celko关于树木和等级制度的书

总结

以上是内存溢出为你收集整理的mysql – SQL数据库设计,递归父子关系?全部内容,希望文章能够帮你解决mysql – SQL数据库设计,递归父子关系?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/sjk/1168330.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-01
下一篇 2022-06-01

发表评论

登录后才能评论

评论列表(0条)

保存