sql - 当我有一个连接到 M2M 表的自外键表时创建面包屑
问题描述
我要解决的问题是在 Django 中,但与我在数据库中的查询方式密切相关。
我有一个模型/表类别,它本身有一个 ForeignKey:
| id | name | parent_id
| 1 | name1 | Null
| 2 | name2 | Null
| 3 | name3 | 1
| 4 | name4 | 1
| 5 | name5 | 3
| 6 | name6 | 3
| 7 | name7 | 5
一个父类可以有多个子类,并且没有深度限制;
我还有一个模型/表产品,它与类别具有多对多关系。一个产品可以在多个类别中,一个类别可以有多个产品
中介表
| id | product_id | category_id
| 1 | 1 | 1
| 2 | 1 | 2
| 3 | 2 | 1
| 4 | 2 | 3
| 5 | 3 | 5
| 6 | 3 | 4
| 7 | 3 | 7
产品表
| id | name
| 1 | name1
| 2 | name2
| 3 | name3
我需要的:
1) 为面包屑获取与产品对应的第一组类别
产品名称 3:类别 ID 1 -> 类别 ID 3 -> 类别 ID 7
2)从一个类别开始获取该类别及其子类别中的所有产品
我想在几个查询中得到它们,避免从子类到父类递归调用数据库
解决方案
您可能想要使用嵌套集 (AKA mptt) 或闭包表。您可以阅读此https://www.slideshare.net/billkarwin/models-for-hierarchical-data,了解更多关于在 SQL 中对分层数据结构建模的各种方法。
嵌套集(mptt)可能是最复杂的模式,但有一个实现它的 django 应用程序的第 3 部分:https ://github.com/django-mptt/django-mptt 。
推荐阅读
- javascript - Stripe 和 React,react-stripe-element 自定义卡片元素,没有 zip 字段
- amazon-web-services - 如何在没有 ngnix 的情况下使用 Elasticbeanstalk(仅使用应用程序负载均衡器)
- javascript - 关于 PhpStorm 中可选链接和空值合并 JavaScript 运算符支持的问题
- python - Python 将命令及其输出写入文件
- c++ - 为什么显式弃用寄存器存储类
- android - 验证在 firebase 回收器适配器中不起作用
- c# - 如果可以更改 VisualParent,如何在 UserControl 中处理订阅
- java - 创建 @ToLowerCase 注释以将字符串值转换为小写
- c++ - 获取 system() 运行的 SFTP 命令的退出代码
- r - 选择列表中的特定框架,其中对象可通过 list[[i]] 访问