MySQL - 从平面表移动到第一范式

标签 mysql database database-design

我正在构建一个允许用户记录 6 周内每周事件的应用程序。每周有 3 个基准记录,这里是一个例子:

Week 1

+------------+-----------+------------+-----------+
| Day        | Minutes   | Location   | Miles     | 
+------------+-----------+------------+-----------+
| Monday     |           |            |           |
+------------+-----------+------------+-----------+
| Tuesday    |           |            |           |
+------------+-----------+------------+-----------+
| Wednesday  |           |            |           |
+------------+-----------+------------+-----------+
| Thursday   |           |            |           |
+------------+-----------+------------+-----------+
| Friday     |           |            |           |
+------------+-----------+------------+-----------+
| Saturday   |           |            |           |
+------------+-----------+------------+-----------+
| Sunday     |           |            |           |
+------------+-----------+------------+-----------+

每周重复一次,最多 6 周。

在我的平面表中,我有以下内容:

用户ID |用户名 |第 1 天 1 分钟 |第 1 周第 1 天地点 |第 1 天 1 英里 |第 1 天 2 分钟 |第 1 周第 2 天地点 |第 1 天 2 英里 ETC...

一周 X 7,然后 6 周 X 6。

我想弄清楚我的消去点在哪里,以及我的单独表格是什么。到目前为止,我有以下内容:

User Table 
+------------+-----------+
| UserID     | Username  |
+------------+-----------+
|            |           |
+------------+-----------+

Activity Table
+------------+-----------+------------+-----------+------------+-----------+
| UserID     | WeekID    | Day        | Minutes   | Location   |   Miles   |
+------------+-----------+------------+-----------+------------+-----------+
|            |           |            |           |            |           |
+------------+-----------+------------+-----------+------------+-----------+

Weeks Table
+------------+-----------+------------+
| UserID     | WeekID    | Week_No    |
+------------+-----------+------------+
|            |           |            |
+------------+-----------+------------+

我认为我的思路是正确的,但周表似乎不正确,我不确定它们之间的关系是什么 - 我认为我不需要在每个表中使用 UserID,而且我不确定PK 应该是什么。

非常感谢对此模式的任何评论,或在给定应用程序要求的情况下实现第一范式的有效方法,非常感谢。

编辑:

非常感谢所有的答案,很棒的东西。

我认为拥有位置表会很有用,因为我可以标准化位置(可以提供可供选择的列表),如果我需要基于位置进行查询,我将拥有一致的位置名称。

将架构修改为:

User Table - UserID PK
+------------+-----------+
| UserID     | Username  |
+------------+-----------+
|            |           |
+------------+-----------+

Activity Table - ActivityID PK
+------------+-----------+------------+-----------+------------+-------------+-----------+
| ActivityID | UserID    | Week_No    | Day       | Minutes    | LocationID  |   Miles   |
+------------+-----------+------------+-----------+------------+-------------+-----------+
|            |           |            |           |            |             |           |
+------------+-----------+------------+-----------+------------+-------------+-----------+

Location Table - LocationID PK
+------------+---------------+
| LocationID | Location_Name |
+------------+---------------+
|            |               |
+------------+---------------+

第二次编辑:

我现在有一个关于这个主题的 2NF 和 3NF 的问题:

MySQL - moving from 1st Normal Form to 2nd and 3rd Normal Forms

最佳答案

添加一个Location 表并将Location 更改为LocationID (PK)。 Weeks 表中不需要 UserID。您可以通过查询 Activity 表找到用户的周数。

如果 Week_No 被用户更改,我只看到需要一个 Week 表,这似乎没有太大意义。否则,您可以将 Activity 表中的 WeekID 替换为 WeekNo,并删除 Weeks 表。

关于MySQL - 从平面表移动到第一范式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3459839/

相关文章:

php - 尝试从mysql数据库显示表时出错

java - 从大型数据库中读取

mysql - 为什么我可以创建名为 "key"和 "value"的表列,但以后不能使用它们?

php - 使用一个表来保存另一个更大表的 COUNT/SUM 是不是糟糕的设计?

php - 原始查询到 Eloquent

mysql - MYSQL 查询中的 INDEX

php - SQL JOIN ON 表名等于字段值

php - 选择并回显所有表格(无论它是什么)

database - TOAD for DB2 的免费替代品

Mysql 检查日期和插入付款划分的最佳方法