设计:你如何决定项目什么时候是相关的,什么时候是属性?

Wol*_*'08 6 erd database-design

我一直试图弄清楚这一点。例如,假设您有一个人。一个人的一个属性就是他或她的社会安全号码,对吗?但一个人还有has一个社会安全号码。因此,在 ER 图中,您可以为person和绘制一个方框ssid,并且可以用菱形将它们连接起来,has。或者,您可以画一个圆,ssid,然后将其连接到一个方形person框。

然而,这不仅仅适用于ssid。可以用具体的东西(例如汽车、宠物或电话号码)或概念性的东西(例如电话号码、友谊或心情)来画或画。那么,我在哪里画线?设计的目的只是为了将所有东西都写在纸上并看起来不错,还是我应该使用指南?

Joe*_*own 5

有两种方法可以看待这个问题:非正式的方法和正式的理论方法。

非正式的方式:

如果您的系统对某些东西非常感兴趣,以至于您想要记录它的属性,那么它可能属于自己的表中。

如果您唯一关心的社会安全号码是它包含哪些数字(即号码是什么),那么最好将该号码建模为其他事物(例如人)的属性。

另一方面,如果您的系统关心与 SSID 相关的其他事实,例如它的发布时间、哪个办公室发布了它以及您可能知道并关心 SSID 的其他任何信息,那么您可能想要拆分您所知道的所有内容将 SSID 放入其自己的表中,然后将该表与 PERSON 相关联。

正式方式:

如果规范化规则要求您将有关 SSID 的多个事实(属性)拆分为一个单独的关系(表),其中社会安全号码是主键,那么 SSID 是一个方框而不是一个圆圈。

具体来说,如果您有仅依赖于 SSID 的属性,那么您可能希望从 PERSON 表中删除这些属性,因为它们仅对PERSON ID具有传递依赖性,因此 3NF 要求将这些属性删除到单独的表中。