将单个类型与多个类型相关联

时间:2011-05-18 13:10:33

标签: database-design database-schema

假装我是马克·扎克伯格,那是2003年。

我正在建立一个社交网站(thefacebook.com),我需要一个建议。

该网站的重点是用户个人资料,但它也支持企业,大学等的个人资料。我们称这些其他个人资料 - 页面个人资料。

两种类型的配置文件(用户配置文件和页面配置文件)都支持电话号码。

我应该如何将这些电话号码存储在数据库中?

以下设计是否有意义:

phones(phone_id, phone_number);
users_phones(user_id, phone_id, ...);
pages_phones(page_id, phone_id, ...);

你是否建议另类设计?

PS:我相信我对这个Facebook的事情很重要,所以通过参与这个问题你可能会参与建设历史。

4 个答案:

答案 0 :(得分:4)

enter image description here

答案 1 :(得分:3)

也许:

users(user_id, phone_number, ...);
pages(page_id, phone_number, ...);

即。你真的关心手机作为一个实体吗?或者电话号码仅仅是用户和页面的有用属性?

对于每个用户和每页的多部手机:

users(user_id, ...);
pages(page_id, ...);
user_phones(user_id, phone_number);
page_phones(page_id, phone_number);

答案 2 :(得分:2)

  

两种类型的配置文件(用户配置文件   和页面配置文件)支持手机   号。

     

我应该如何存储这些手机的电话   数据库中的数字?

在个人资料电话号码表中。

More information关于这种模式。并even more information

答案 3 :(得分:0)

有两个概念在混淆。

(1):即使您有默认实体或主要配置文件,您使用的是几个相似但不完全相同的实体(“配置文件”)。

所有实体的某些属性或字段都相同。某些属性或字段对于每种实体都是不同的。此场景或模式称为“泛化”,通常会被转换为带有其他子表的主共享表:

http://en.wikipedia.org/wiki/Class_diagram#Generalization

profiletypes {profiletype_id,profiletype_name}

个人资料{profile_id,profiletype_id,profiletype_name}

profile_user {profile_id,profiletype_firstname,profiletype_lastname,profiletype_ssn,...}

profile_company {profile_id,profiletype_companyname,...}

profile_rockband {profile_id,profiletype_bandname,...}

(2):你有一个可以重复几次的字段,但仍然有一个默认值。

一般;我在主“配置文件”/“表格”中添加了1或2个“默认”电话号码,并为手机创建了一个附加表格。

个人资料{profile_id,profiletype_id,profiletype_name,profiletype_defaultphonenumber}

手机{phone_id,profile_id,phone_number}