database - 数据库设计中的陷阱

标签 database database-design

我需要为某个地方设计一个数据库。我有以下实体: '食物' -> foodId, foodName '消费者'-> c_Id,c早餐,c午餐,c晚餐 消费者吃三遍。早餐、午餐和晚餐,这些字段从带有 ID 的“食物”实体中获取食物。 但最终我还是掉进了陷阱。我无法把三餐分开做早餐、午餐和晚餐。 什么设计更适合这个问题?

最佳答案

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

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    |
| .. | ......... |
+----+-----------+

关于database - 数据库设计中的陷阱,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15323024/

相关文章:

mysql - 验证具有多个 parent 和多个 child 的列表(图)

mysql - 获取重复记录最多的X行

mysql - Riak 的限制

mysql - 我应该为我的 MySQL 数据库使用 MyISAM 还是 InnoDB 表?

Mysql外键

.net - 如何在数据库中存储统计信息

sql - 免费的 SQL 比较工具

c++ - 使用 C/C++ 连接 mySQL 数据库?

database - 可空外键会违反什么范式?

database-design - OLAP 和 OLTP 中的规范化