我目前正在为商会设计联系人管理数据库。数据库的目标是存储所有人(我们自己的员工除外),所有记录的公司(常规公司和会员),地址< / strong>员工目前负责的人员和公司任务,我们的员工列表(用户)和角色在会议厅内。
person
适用于一个company
company
有多个person
person
和company
可以有多个address
company
可以有多个industry
industry
可以有多个company
company
可以有多个membertype
membertype
可以有多个company
user
可以播放多个role
role
分配给mutliple user
user
可以有多个task
task
可由多个user
task
可以定位多个person
person
可以由多个task
person
只能添加一个user
user
可以添加多个person
company
可以有0个或1个parent_company
parent_company
可以有多个子公司我提出了以下设计,它经历了一些变化:
user-task-person
关系?person
只能有一个email
但可以有多个tel
,那么我应该为tel
制作一个额外的表格email
}仍然在person
表中?是否会被认为是&#34;不清洁&#34;?membertype
,company_id
和typename
都应该是PK?我是数据库中的新手,肯定存在一些设计缺陷或错误,如果你们能给我一些建议以便我能纠正和改进这个设计,那就太好了。谢谢^〜^
答案 0 :(得分:1)
我看到的主要问题是,虽然所有主键都定义为Int,但是一些外键或引用被定义为varchar。
此外,role_id的长度为10,而所有其他主键为11 我个人更喜欢大写的表名,用户,公司等
已修改版本的更新:
您可能想要创建一个电话,邮件,传真等表格,例如contact_info
,其中可能包含一个包含联系信息的字符串字段和一个类型字段(电子邮件,电话,传真......)。这样你可以存储几个电话号码,如果你想将电子邮件限制为一个,你可以把它留在person
表中,不要在这里允许,或者有一个业务规则,只允许在{{ {1}}。
如果您要将contact_info
的电子邮件或电话号码(例如contact@somecompany.com)或号码存储到公司总机
company
也很有用。
对于表membertype,company_id和typename都应该是PK吗?
是
第二次更新
关于地址解决方案:
company
表不应该包含足够的信息来使每个地址都是唯一的,我可以理解公司可以有多个地址但是它应该允许两家公司拥有相同的地址(我的意思是相同的)数据库中的行)所以也许它应该从address
和'地址'改为一对多,而在另一个方向一对一改为。
我还认为在两个地址链接表中添加某种标签可能会很好,因此可以轻松识别“home”,“work”,“Office”,“Warehouse”等地址...