0

我想创建一个包含个人信息和登录详细信息的朋友表。

最好将成员表分成 2 个表,一个包含最少的详细信息,第二个包含其他详细信息。

还是留在一张桌子上?

我有很多包含成员外键的表。

4

3 回答 3

3

一张表,除非您可能需要将一个成员关联到多组详细信息(即多个电子邮件地址、用户组、白天电话、夜间电话、手机等)。

于 2009-07-06T13:18:56.563 回答
3

这在很大程度上取决于那些“其他”细节是什么。这是一个常见而有趣的问题,乍一看并没有“硬性”的答案。但是,如果我们更抽象地考虑这个问题,关于您想要表示的任何特定事物的属性(“细节”)之间的实际关系,我们可能会发现一些清晰。

在你的问题中,你说朋友有“最少”和“其他”的细节。与其将这些细节分类为“最小”或“其他”,让我们根据是否任何个人(“原子”)细节可以完全由使朋友与众不同的因素来对它们进行分类。

我假设有一些主键(PK),比如 FriendID 或电子邮件地址或其他东西。考虑到这个唯一的标识符,问问自己:“如果给我一个 FriendID(或电子邮件或任何你用作 PK 的东西)我绝对确定那个朋友的哪些详细信息?例如,给定 FriendID=2112,我绝对知道那个朋友的名字、姓氏和出生日期,但我知道那个朋友的电话号码,因为不止一个。

将您在 PK 中明确知道的所有详细信息组合在一张表中。将您需要更多数据的详细信息(如电话号码中的“家庭”或“工作”)放在“子”表中,外键返回到 PK 上的“父”表。(注意:子表的 PK 极有可能是复合的,即由父表的 PK 和区分因子(如本例中的“家”或“工作”)组成。多方的复合键1-M 的关系非常好。)

数据库极客将这种分解称为基于功能依赖的分解。

于 2009-07-06T14:59:00.310 回答
0

毫无疑问:当它在逻辑上有意义时,总是拆分表。

例如:朋友 1:汤姆琼斯住在山谷 朋友 2:艾琳琼斯也住在他们家,因为它是他的兄弟

表:

Friends
Id  Name          Address
1   Tom Jones     1
2   Erin Jones    1

Adresses 
Id Address
1  The valley

否则事情总是会出现:

Friends
Id  Name          Address
1   Tom Jones     The Valey
2   Erin Jones    The Valley

这将导致错误的查询。

这只是一个问题,还有很多。如果有 2 个电子邮件地址和 3 个手机号码会怎样?如果街道名称发生变化并且有 5 个朋友住在其中怎么办?

如果您非常确定您的表会很小,并且您不必查询它,那么您可以只使用一张表。但是,您也可以只使用 sw 之类的 Excel 或一张纸 :-)

但是,如果您想拥有一个数据库,请将其视为一个。

阅读有关整个问题的规范化。

于 2009-07-06T13:44:28.487 回答