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中,而不是数据库中(但是当需要添加新选项时呢)?我需要强制对某些组件进行单个选择,但允许对其他组件进行多个选择。提供的模式我不满意。
1条答案
按热度按时间7jmck4yq1#
如果给定的三明治可能只有一个特定属性的值,那么将它们设置为
pbj_sandwiches
表中的属性。这具有多个优点。您可以创建真实的的外键约束,因为您不再使用多态关系。
另外,您也不会有异常的风险,比如
pbj_sandwich_components
表中的多行引用具有不兼容选项的同一三明治(例如对于同一个三明治有两种不同的切割方式)。对于多值属性(如附加的可选组件),这些属性需要位于其自己的子表中。
对于每个多值属性 *,您需要一个额外的表 *,否则您会因为违反第四范式而陷入困境。例如,请参见我对“如何在一个表上使用许多m:n关系建模数据库”的回答