2012-11-25 69 views
1

数据库正常化让我非常紧张。假设我有一个场景来找出共同的朋友。而我使用的三个字段我的数据库遵守数据库规范化

conn_iduser_idfriend_id

USER_ID表示用户的正常ID,和朋友id表示相同的,我只是想给每个相关用户的朋友。

我现在输入用户ID,然后输入朋友的ID,一个记录每个

例如:

conn_id | USER_ID | friend_id

1 - US1 - US2

2 - US1 - US3

3 - US1 - US5

4 - US3 - US1

5 - US3 - US6

........................................等等

它如何不符合数据库规范化?

编辑(澄清评论):

有人让我疑惑的说,我有一个记录与用户1 - 用户2。另一个记录与user2 - user1:这不违反规范化,是吗?

+0

不确定,一张有两个FK的表大约可以得到标准化,但我有时会在像这样的简单表中省略PID列...也许他们反对呢? – Mitch

+0

那么,如果没有PID,列,至少用第一个正态表达式来做这个事情吗? @Mitch – cipher

+1

另请参阅:http://dba.stackexchange.com/questions/10199/how-should-i-design-a-relationship-table-for-friendship – FoolishSeth

回答

1

常见的规范化违规行为是,当行已由其中的某列或某列的列组合唯一标识时,该行的序列号正在粘合。当然,人们总是这样做。有理由保持你的模式正常化,并有很多理由不是也这样做。

在这里看起来就是这种情况。如果重复条目(user_id,friend_id)没有意义,那么可以将该列组合用作主键。除非顺序号本身具有实际意义,否则它可能与归一化方面无关。

UPDATE

另一个你带了下面要考虑的是重复记录的可能性,例如(u1→u2)和(u2→u1)。这归结为友谊是否可交换的问题。

如果user2是user1的好友,那么user1是否也是user2的好友?如果友谊是可交换的,那么你会有重复的记录。如果这就像一个社交应用程序,我会认为情况并非如此,这些都不会是重复的记录:它们代表两个完全独立的关系。

+0

我编辑了这篇文章。请看现在@FoolishSeth – cipher

+0

因此,如果我删除conn_id,它是否符合至少1NF的形式? – cipher

+0

我很确定它已经是1NF了,没有做任何改变。你为什么认为它不在1NF? – FoolishSeth