嗨!!
我想在我的 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/