我正在开发一个应用程序,用户将图片上传到服务器,然后通过显示这些图片的链接向他们选择的人发送电子邮件。
我的问题是关于在数据库中组织人员(我正在使用MySQL)。
我希望每个用户都有这样的人树:
我想到了数据库中的以下组织:
电子邮件表(所有用户的电子邮件)
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的电子邮件,则所有其他用户也会看到此更改(他们将收到有关此更改的电子邮件)。你认为这会导致问题吗?
我会感激你的意见!
答案 0 :(得分:2)
Oy公司。给定的电子邮件可以与不同的“人”相关联?我认为这种语义非常难看。我会重命名人员表联系人。我还要将Emails表中的'name'字段重命名为DefaultName,以表明它严格来说是后备。
除了语义(这是一个大问题,如果其他人必须使用此数据库),您使用varchar(20)将所有者引用为外键。没有迹象表明它正在引用什么,我认为它是某种Owners表,用户名作为主键。我建议使用int代理键...如果用户想要更改用户名,会发生什么?
最后,我身上的坚持者会改变'无群体'联系人。我会为每个联系人创建一个默认组,称之为_Groupless,并将像Tanya这样的'groupless'联系人分配给_Groupless组。该应用程序可以整理细节。我不特别喜欢可选的外键。