【问题标题】:Trap in database design数据库设计中的陷阱
【发布时间】:2013-10-23 23:26:01
【问题描述】:

我需要为某个地方设计一个数据库。我有以下实体: '食物' -> foodId, foodName '消费者'-> c_Id,cBreakfast,cLunch,cDinner 消费者吃的是三倍。早餐、午餐和晚餐,这些字段从带有其 ID 的“食物”实体中获取食物。 但最终我会落入陷阱。我不能把它分成三餐早餐、午餐和晚餐呢。 什么样的设计更适合这个问题?

【问题讨论】:

  • 在我看来,创建另一个包含白天时间的表会更好,例如eat_time,字段 id、name 并填写“早餐”、“午餐”和“晚餐”,并创建表这将合并所有表,如 consumer_food_with_time 和字段 id、consumer_id、food_id、eat_time_id

标签: database database-design


【解决方案1】:

以下架构可让您跟踪谁吃了什么以及吃了哪顿饭。在我的示例中,您可以看到 Bob 早餐吃煎蛋卷,午餐吃沙拉,晚餐吃牛排。玛丽错过了早餐,午餐吃了牛排,晚餐吃了沙拉。

consumers
    id              unsigned int(P)
    name            varchar(30)

+----+------+
| id | name |
+----+------+
|  1 | Bob  |
|  2 | Mary |
| .. | .... |
+----+------+

consumptions
    id              unsigned int(P)
    consumer_id     unsigned int(F consumers.id)
    mealtime_id     unsigned int(F mealtimes.id)
    food_id         unsigned int(F foods.id)

+----+-------------+-------------+---------+
| id | consumer_id | mealtime_id | food_id |
+----+-------------+-------------+---------+
|  1 |           1 |           1 |       1 |
|  2 |           1 |           2 |       2 |
|  3 |           1 |           3 |       3 |
|  4 |           2 |           2 |       3 |
|  5 |           2 |           3 |       2 |
| .. | ........... | ........... | ....... |
+----+-------------+-------------+---------+

foods
    id              unsigned int(P)
    name            varchar(20)

+----+--------+
| id | name   |
+----+--------+
|  1 | Omelet |
|  2 | Salad  |
|  3 | Steak  |
| .. | ...... |
+----+--------+

mealtimes
    id              unsigned int(P)
    name            varchar(10)

+----+-----------+
| id | name      |
+----+-----------+
|  1 | Breakfast |
|  2 | Lunch     |
|  3 | Dinner    |
| .. | ......... |
+----+-----------+

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-02
    • 1970-01-01
    • 1970-01-01
    • 2011-05-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多