mysql PB&J三明治的关系数据库模式

fnvucqvd  于 2023-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(128)

PB&J是我想保密的真实的数据的替身。我想对不同餐馆提供的花生酱和果冻三明治(PB&J)进行分类,以确定哪些餐馆提供的三明治最符合用户的口味。制约因素:

  • PB&J三明治有以下成分:
  • 面包(白色、小麦面包、奶油蛋卷等)。
  • 果冻(草莓、葡萄等)。
  • 花生酱(奶油状、松脆状等)。
  • 其他成分(香蕉,奇亚籽,蜂蜜,棉花糖绒毛等)。
  • 切割(正方形、三角形等)。
  • 每个三明治只能选择以下成分之一(面包、果冻、花生酱、切块)。
  • 您可以选择一种或多种其他成分。
  • 一家餐厅可以有一个或多个PB&J的分配给它。
  • 一个用户将有一个PB&J分配给他们(表示他们的偏好)。我不喜欢这种方法,因为pbj_sandwiches表依赖于将id与它们所属的表在单独的列中进行匹配:

users

  • id - int主键
  • 名称-字符串
  • 电子邮件-字符串

restaurant

  • id - int主键
  • 名称-字符串

user_sandwiches

  • id - int主键
  • user_id - int FK UNIQUE > user.id
  • pbj_sandwich_id - int FK >- pbj_sandwich.id

restaurant_sandwiches

  • id - int主键
  • restaurant_id - int FK > restaurant.id
  • pbj_sandwich_id - int FK >- pbj_sandwich.id

pbj_sandwiches

  • id

pbj_sandwich_components

  • id
  • pbj_sandwich_id - int FK >- pbj_sandwich.id
  • component_id int FK(pbj_sandwich_bread.id,pbj_sandwich_jellies.id,pbj_sandwich_peanut_butters.id,pbj_sandwich_other_ingredients.id,pbj_sandwich_cuts.id)
  • component_table - string(pbj_sandwich_bread,pbj_sandwich_jellies,pbj_sandwich_peanut_butters,pbj_sandwich_other_ingredients,pbj_sandwich_cuts)

pbj_sandwich_bread

  • id
  • 姓名

pbj_sandwich_jellies

  • id
  • 姓名

pbj_sandwich_peanut_butters

  • id
  • 姓名

pbj_sandwich_other_ingredients

  • id
  • 姓名

pbj_sandwich_cuts

  • id
  • 姓名

也许我可以像分类法一样处理组件?组件类型是否应该更静态地存储在代码中的ENUM中,而不是数据库中(但是当需要添加新选项时呢)?我需要强制对某些组件进行单个选择,但允许对其他组件进行多个选择。提供的模式我不满意。

7jmck4yq

7jmck4yq1#

如果给定的三明治可能只有一个特定属性的值,那么将它们设置为pbj_sandwiches表中的属性。

pbj_sandwiches:

    id
    bread_id - int FK >- pbj_sandwich_bread.id
    jelly_id - int FK >- pbj_sandwich_jellies.id
    peanut_butter_id - int FK >- pbj_sandwich_peanut_butters.id
    cut_id - int FK >- pbj_sandwich_cuts.id

这具有多个优点。您可以创建真实的的外键约束,因为您不再使用多态关系。
另外,您也不会有异常的风险,比如pbj_sandwich_components表中的多行引用具有不兼容选项的同一三明治(例如对于同一个三明治有两种不同的切割方式)。
对于多值属性(如附加的可选组件),这些属性需要位于其自己的子表中。

pbj_sandwich_options:

    id
    option_id - int FK >- pbj_sandwich_other_ingredients

对于每个多值属性 *,您需要一个额外的表 *,否则您会因为违反第四范式而陷入困境。例如,请参见我对“如何在一个表上使用许多m:n关系建模数据库”的回答

相关问题