【问题标题】:Reflecting a decorator pattern in mysql database table在 mysql 数据库表中反映装饰器模式
【发布时间】:2013-08-19 03:56:19
【问题描述】:

我正在使用 mysql 数据库和 java。我对装饰器模式的理解是它允许非常灵活的运行时,因为您可以分配任意数量的装饰器,直到您获得所需的对象的行为或表示。我之前已经成功编写了几个装饰器,现在我想将我的装饰对象的状态存储到数据库中(最好是 mysql)。例如:

假设我正在为一家咖啡店编写一个系统,而我用于表示饮料成本的模型使用了一个装饰器(即,具体对象是浓缩咖啡,它可以用牛奶、糖、鲜奶油、糖浆和其他任何东西来装饰)这些天放咖啡。)此外,假设我目前无法预测将来我的咖啡中可以有多少不同的成分(也许有一天人们会想要在他们的咖啡中加入果冻豆,但我还不知道)

现在我想记录每次有人购买饮料,并跟踪使用的成分。设计我的数据库模式以便它可以处理出现的新成分的最佳方法是什么。我目前有两个想法,似乎都不是正确的方法:

1) 将饮料编码为 json 字符串,然后将其转储到数据库中,假设我的数据访问对象可以处理解码。

2) 尝试预测对饮料的所有可能修改,并为每一个创建列,每次有人提出新的饮料添加时,我都必须更改架构。

肯定有比这两种方法更好的方法。

【问题讨论】:

  • 装饰器模式旨在将行为添加到类中。你的问题是简单的加法。只需将“装饰”作为附加成分存储在您的数据库中,然后根据需要将它们添加到咖啡中。如果出现新成分,可以将它们作为新成分记录添加到数据库中。
  • 使用两个表:Dish(或更好的名称,如 Beverage)和成分可能?
  • 您需要在BeverageIngredients 之间建立many-to-many 关系。 一种特定饮料的各种属性(订单 ID、折扣或其他)可以存储为关系的属性。
  • 这可能会让sqlfiddle.com/#!2/bf831 让你走上正轨。假设它是一家咖啡店,您只能在其中购买咖啡,而不是咖啡店的荷兰语版本...使用此模式,您可以添加简单的新类型和计算统计信息/总成本。
  • @RaymondN 添加了约束,如果我理解得很好,每个咖啡可能有 0 到许多额外的 成分

标签: java mysql design-patterns decorator


【解决方案1】:

尝试为此使用 3 个表,一个用于配料表,一个用于订单,以及两者之间的查找表。每次创建订单时,您都会在 orders 中添加一行,在 orders_ingredients 中添加多行

create table orders {
   order_id int AUTO_INCREMENT PRIMARY KEY, 
   order_name 
);

create table orders_ingredients {
   order_id references orders(order_id)
   ingredient_id references ingredients(ingredient_id)
);

create table ingredients {
   ingredient_id int AUTO_INCREMENT PRIMARY KEY, 
   ingredient_name varchar(255)
);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-07
    • 2021-04-11
    相关资源
    最近更新 更多