MySQL - 从第一范式转换到第二和第三范式

时间:2010-08-11 20:30:29

标签: mysql database database-design database-normalization

这个问题直接涉及前一个主题“MySQL - 从平面表转移到第一范式”(http://bit.ly/9pvS0Y - 我正在问一个关于转移到第二个问题的问题和第三范式,我认为最好开始一个新话题。

下面是我的第一个普通表格架构,我非常确定它对我的目的来说足够坚实,但如果我错了,请纠正我。

我想知道如何将其移至第二和第三种形式,任何关于我的表如何受2NF和3NF规则影响的指针都非常有用,谢谢。

关系

- 活动和位置关系=一对多 - 一个活动可以有一个位置,一个位置可以有多个活动(LocationID为活动中的FK)

- 活动和周关系=一对多 - 一个活动可以有一个星期,一个星期可以有很多活动(活动中的WeekID为FK)

- 用户和活动 =多对多 - 一个用户可以有很多活动,一个活动可以有很多用户

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


Activity Table - ActivityID PK / WeekID FK / LocationID FK
+------------+-----------+------------+-----------+------------+-------------+-----------+
| ActivityID | UserID    | WeekID     | Day       | Minutes    | LocationID  |   Miles   |
+------------+-----------+------------+-----------+------------+-------------+-----------+
|            |           |            |           |            |             |           | 
+------------+-----------+------------+-----------+------------+-------------+-----------+


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


Weeks Table - Week ID PK
+------------+-----------+
|WeekID      | Week_No   |             
+------------+-----------+
|            |           |
+------------+-----------+


User_Activity Table 
+------------+---------------+
| UserID     | ActivityID    |
+------------+---------------+
|            |               |
+------------+---------------+

4 个答案:

答案 0 :(得分:1)

不确定表User_Activity的用途,因为您已在活动表中定义了两个列。否则 - 此设计已经达到第3范式。

答案 1 :(得分:1)

除非这是学术练习,否则我建议你不要“通过”正常形式。该过程的正式名称是按分解标准化。然而,在大多数情况下它并不是很实用,而且通常是完全没必要的。

在实践中,从已经假设规范化的模式(通常以5NF或BCNF而不是3NF为目标)开始然后验证它更有意义。设计已经在所需NF中的模式的过程称为通过综合进行标准化,它比分解方法更接近大多数从业者的工作方式。通过Sythesis实现标准化有几种精确的技术,但到目前为止,最常用的方法只是良好的分析,经验和常识的结合。

答案 2 :(得分:0)

正如russjudge所说,我看不到User_Activity表的目的。

在规范化中,通常最好的做法是尽可能使用自然键。因此,我无法看到Weeks表的重点 - 为什么不使用Week_No? (如果您想设置具有不同天数的“周”,可能会出现例外情况 - 在这种情况下,您可能还希望在Weeks表中包含开始日期和结束日期。但是,尽管如此,我不明白这一点。)

事实上,我会更进一步,并在Activity表上用一个日期字段替换周和日 - 这实际上应该是1NF的一部分(删除派生数据)。大多数SQL版本(包括MySQL)可以根据需要随时将日期字段转换为日期或星期。

我也很想删除ActivityID字段,而是使用UserID,Date和LocationID的组合作为Activity表上的复合主键。但是,可能需要为同一用户,日期和位置记录多行 - 在这种情况下,ActivityID字段应保留为表的主键。

答案 3 :(得分:0)

如果“Week_no”表示“周数”,则将“Week_no”移至“Activity”,然后将表格“Weeks”删除。