-1

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

下面是我的第一个范式模式,我很确定它对于我的目的来说足够可靠,但如果我错了,请纠正我。

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

关系

- Activity和Location的关系=一对多 - 一个activity可以有一个location,一个location可以有很多activity(LocationID作为Activity中的FK)

- Activity和Week的关系=一对多 - 一个activity可以有一周,一周可以有很多activity(WeekID作为Activity中的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

4 回答 4

1

不确定您对表 User_Activity 的用途,因为您已经在活动表中定义了这两个列。否则——这个设计已经进入了第三范式。

于 2010-08-11T20:38:42.750 回答
1

除非这是一项学术练习,否则我建议您不要“通过”正常形式。该过程的正式名称是Normalization by Decomposition。然而,在大多数情况下它不是很实用,通常完全没有必要。

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

于 2010-08-11T21:44:10.170 回答
0

如果“Week_no”表示“周数”,则将“Week_no”移动到“Activity”中,并删除“Weeks”表。

于 2011-01-15T11:26:13.630 回答
0

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

在规范化中,通常最好的做法是尽可能使用自然键。因此,我也看不到 Weeks 表的意义——为什么不直接使用 Week_No?(这里的一个可能的例外情况是,如果您想设置不同天数的“周” - 在这种情况下,您可能还想在 Weeks 表中包含开始日期和结束日期。不过,我没看到重点。)

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

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

于 2010-08-12T11:01:07.583 回答