主键和数据库规范化

时间:2011-09-15 14:11:50

标签: database database-design

  

可能重复:
  Should each and every table have a primary key?

我一直在研究关于数据库规范化的学校项目。 我需要帮助来规范化没有主键的表 我遇到困难的表是订阅表,它的结构如下:

itemSubscribed  emailAddress
--------------  ------------
1               a@b.com
1               b@c.com
1               a@b.com
2               x@z.com
2               aaa@b.com
3               a@b.com

请注意,itemSubscribedemailAddress值可能会重复,因此两者都不能成为主键。

这个结构可以正常使用我的代码,因为我可以在项目X中有更新时向所有项目X订阅者发送电子邮件,但我的老师需要一个规范化的数据库,而1NF必须有一个主键。

如果我为了拥有主键而创建了一个自动生成的主键,我无法继续使用3NF,因为它要求所有列都依赖于主键,w / c不是这种情况。

我应该创建自动生成的主键吗?我错过了关于3NF的事情吗?

3 个答案:

答案 0 :(得分:1)

具有重复行的表不表示关系。关系是一组元组。一个集合中不会有多个相同的元素。一个包就像一个集合,但可以有多个看起来相同的元素实例。

在你给我们的表格中,我假设itemSubscribed是一个计数,而itemSubscribed等于一个的两行具有相同的emailAddress描述不同的事件。

但这是你的想法,在数据中不可见。

你会遇到这张桌子的麻烦。特别是,没有办法区分错误的重复条目和两个看起来相似的有效条目。

答案 1 :(得分:0)

您是否可以多次订阅一个项目的同一个电子邮件地址?如果不是你的自然键是显而易见的:itemSubscribed和emailAddress。即使您在这种情况下选择了人工主键,您可能希望在两列中使用唯一索引。

答案 2 :(得分:0)

在回答你的问题时,是的,没有主键是非常糟糕的。数据库必须能够识别特定记录。假设您想以粗体显示下面显示的记录,而不是以斜体更新。没有主键,你会怎么做呢。

itemSubscribed emailAddress


1 a@b.com

1 b@c.com

1 a@b.com

在数据库类中,如果您有任何没有主键的表,我会失败,这对数据库设计至关重要。

现在我怀疑你不希望实际拥有所显示的数据,除非你有其他不同的列。为什么你真的想要两个订阅相同项目的记录和相同的电子邮件地址?最好有一个PK或唯一索引来防止这种不良数据。我怀疑你真的有两个字段的自然键,目前只有不良数据。