mysql - 如何在mysql中保存一棵树?

标签 mysql database-design

嗨!!

我想在我的 cooking 食谱中保存一个类别。

喜欢:意大利肉酱面

meal-->noodle_dishes-->italian-->spaghetti_bolognese 

如何保存这样的遗产?

谢谢

最佳答案

如果您不介意围绕类别树的管理做一些家务,那么您可以使用一种方案,其中食谱进入叶(最低)级别类别,并且所有其他类别关系都使用边界展平数字。您仍将拥有管理树的递归关系,但不会使用它来检索/查询收件人。

这是它的样子:

Category
- Category ID
- Name
- (anything else you want to know about categories)
- Parent Category ID (FK to self / NULL for top level)
- Lower Bound
- Upper Bound

Recipe
- Recipe ID
- Category ID (FK - points to the lowest level / most specific category)
- (anything else you want to know about a recipe)

诀窍是下限和上限。您像这样填充类别表:

Category: 
  Desserts ID=1 Parent=null {Lower=1, Upper=4}
  Cakes ID=2 Parent=1 {2, 4}
  Chocolate Cakes ID=3 Parent=2 {3, 3}
  Fruit Cakes ID=4 Parent=2 {4, 4}
  Appetizers ID=5 Parent=null {Lower=5, Upper=...}
...

因此,例如,当您查询甜点食谱时,您会发现类别 ID 介于 Cakes 类别的下限和上限之间(即介于 2 和 4 之间)的所有食谱。

为了完成这项工作,您需要有程序代码,只要您对类别层次结构进行更改,该代码就会返回并重新计算类别表中的所有下限和上限。因为与更改食谱相比,这是应该很少发生的事情。如果您想优雅一点,可以找到将重新计算限制在受影响区域的方法。

警告说明,为了简单解释概念,我根据类别 ID 设置了下限和上限。显然,您不能为此目的使用增量 ID,因为您的类别必须排序。因此,您的类别表需要第二个候选键,当您在层次结构更改时进行递归限制计算时,可以重新计算它。因此,在查询时,您使用真实的(递增的)类别 ID 来查找叶类别,然后使用该类别记录的下限和上限来过滤其他类别,并加入符合您条件的收件人。

关于mysql - 如何在mysql中保存一棵树?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5857707/

相关文章:

php - 如何在 PHP 中按日期对 MySQL 条目进行排序?

mysql - 是否可以在 MySQL 中循环获取销售数据?

mysql - 如何编写存储过程在多个表中插入值

约会门户的Mysql表和索引设计

postgresql - 将行级安全与列授权相结合

asp.net - 存储库是单例的还是静态的还是都不是?

mysql - XAMPP 的 MYSQL 使用超过 400MB 的 RAM

security - 我的密码盐应该有多大?

.net - 如何在 Entity Framework 中使用外键作为复合主键的一部分?

mysql - 连接到 Mysql 选项未在 MS Visual Studio 2017 中显示