用于处理不同业务级别的相似/相同对象的数据库结构

时间:2015-07-16 23:19:23

标签: django data-modeling database-relations generic-foreign-key abstract-base-class

方案

一个着名的墨西哥卷饼店需要使用模型ComboComboItemIngredientOrder构建一个Django应用。

  1. 总部希望创建包含物品的各种组合,并布置原始物品成分和价格。
  2. 然后,每个特许经营商可以选择他们将在其菜单上销售哪些组合,并允许他们调整商店的组合商品的价格和成分。
  3. 当订单进入时,组合和项目详细信息应显示在日志中,如果HQ重命名组合或特许经营权更改价格/成分,则日后不应更改。
  4. 用例

    1. HQ创造了“Hot Taco Combo”。它有三个相关的组合项

      • 一个炸玉米饼(价格:0.99美元,原料:贝壳,牛肉,奶酪,辣酱)
      • churro-spirals(价格:$ .79)
      • 饮料(价格:1.29美元)
    2. 纽约特许经营店将Hot Taco Combo添加到他们的菜单中。他们将墨西哥卷饼的价格调整为1.49美元,并将生菜加入炸玉米饼。

    3. 客户在墨西哥玉米卷中没有奶酪的情况下订购组合。

    4. HQ将组合的名称更改为Fiery Taco Combo - NY的组合名称更新,但是taco保持相同的自定义价格并且仍包含生菜。

    5. 纽约特许经营店的经理查看所有订单,看到 Hot Taco Combo 的一个订单,而且炸玉米饼配料只有贝壳,肉和生菜。

    6. 问题

      我很难决定处理这个问题的最佳方法,因为Combo在所有三个级别基本上都是同一个对象,但其相关的ComboItem对象可能不同。 HQ应该能够像名称一样更新Combo属性,它会更新所有特许经营组合名称,但组合项目自定义应该保留。此外,销售点的组合详细信息和自定义设置一旦记录,就不应更改,以获得准确的订单记录。

      最初我认为每个业务级别从每个模型和对象继承的相关模型和对象都有一个AbstractBaseClass,但这种结构感觉多余且难以维护。

      然后我想使用GenericForeignKey将组合与总部,特许经营或订单相关联,并在必要时重复对象,因为它们向下移动。这感觉奇怪且容易出错。

      有没有人处理此类案件或有任何建议?这仅仅是一个复杂的问题,需要一个复杂的解决方案,还是我缺少一个简单的方法?提前谢谢。

1 个答案:

答案 0 :(得分:1)

听起来不是抽象基类,而是希望使用多表继承:https://docs.djangoproject.com/en/1.8/topics/db/models/#multi-table-inheritance

我建议您阅读整个文档部分,了解继承样式的选项:https://docs.djangoproject.com/en/1.8/topics/db/models/#model-inheritance