群组 - 人员数据库设计 - 需要建议

时间:2010-08-09 13:47:58

标签: mysql database database-design

我正在开发一个应用程序,用户将图片上传到服务器,然后通过显示这些图片的链接向他们选择的人发送电子邮件。

我的问题是关于在数据库中组织人员(我正在使用MySQL)。

我希望每个用户都有这样的人树:

  • 家庭
    • 妈妈
    • 爸爸
    • 乔纳森
  • 关闭朋友
    • 大卫
    • 罗尼
  • 其他
    • 朱莉娅
    • Piter酒店
    • 亚历
  • Tanya(不属于任何团体)

我想到了数据库中的以下组织:

电子邮件表(所有用户的电子邮件)

http://i38.tinypic.com/2586yol.jpg

群组表(所有用户群组)

http://i33.tinypic.com/2vkyoer.jpg

人员表(所有用户群)

http://i33.tinypic.com/33uslg5.jpg

在电子邮件表中,不会有两封相同的电子邮件。 Emails Table中的名称是用户在添加电子邮件时向其提供的名称(我称之为默认名称)。每个用户可能对同一个人具有不同的名称。因此,这就是People Table中的名称People Table中的 name = NULL 表示默认名称将显示在人员树中。 group_id = NULL 表示此人不属于任何群组。

这一切看起来都合理吗?

此外,正如您所看到的,用户之间共享某种电子邮件。这意味着如果Julia更改了David的电子邮件,则所有其他用户也会看到此更改(他们将收到有关此更改的电子邮件)。你认为这会导致问题吗?

我会感激你的意见!

1 个答案:

答案 0 :(得分:2)

Oy公司。给定的电子邮件可以与不同的“人”相关联?我认为这种语义非常难看。我会重命名人员表联系人。我还要将Emails表中的'name'字段重命名为DefaultName,以表明它严格来说是后备。

除了语义(这是一个大问题,如果其他人必须使用此数据库),您使用varchar(20)将所有者引用为外键。没有迹象表明它正在引用什么,我认为它是某种Owners表,用户名作为主键。我建议使用int代理键...如果用户想要更改用户名,会发生什么?

最后,我身上的坚持者会改变'无群体'联系人。我会为每个联系人创建一个默认组,称之为_Groupless,并将像Tanya这样的'groupless'联系人分配给_Groupless组。该应用程序可以整理细节。我不特别喜欢可选的外键。