我目前正在为一个商会设计一个联系人管理数据库。数据库的目标是存储所有人员(我们自己的员工除外)、所有记录的公司(正规公司和商会成员)、人员和公司的地址、员工目前负责的任务、我们的员工(用户)列表和商会内的角色。
业务规则
1 person
为一个人工作 company
1 company
有多个
person person
以及 company
可以有多个 address
1 company
可以是多个 industry
1 industry
可以有多个 company
1 company
可以有多个 membertype
1 membertype
可以有多个 company
1 user
可以播放多个 role
1 role
可以分配给mutliple user
1 user
可以有多个 task
1 task
可以由多个 user
1 task
可以针对多个 person
1 person
可被多个 task
1 person
只能添加一个 user
1 user
可以添加多个 person
1 company
可以有0或1 parent_company
1 parent_company
可以有多个子公司
我提出了以下设计,并进行了一些修改:
发行
有没有更好的方法来展示 user-task-person
关系?
例如,如果 person
只能有一个 email
但可以有多个 tel
,我应该为你多做一张table吗 tel
而 email
仍在调查中 person
table?会被认为是“不干净”吗?
为了那张table membertype
,应该 company_id
以及 typename
都是pk?
这个模式现在看起来怎么样?还有一些正常化的工作要做吗?
我是一个在数据库的新手,肯定有一些设计缺陷或错误,如果你们能给我一些建议,使我可以纠正和改进这个设计,这将是很好的。谢谢^~^
1条答案
按热度按时间rsl1atfo1#
我看到的主要问题是,虽然所有主键都被定义为int,但一些外键或引用被定义为varchar。
联系人表中的公司
用户表中的用户角色
公司中的母公司
在用户表中添加
另外,角色id的长度为10,而所有其他主键的长度为11。
就我个人而言,我更喜欢大写的表名,用户,公司等
已编辑版本的更新:
您可能需要为电话、邮件、传真等创建一个表
contact_info
它可以包含一个保存联系人信息的字符串字段和一个类型字段(电子邮件、电话、传真等)。这样你可以存储几个电话号码,例如,如果你想限制电子邮件的数量,你可以把它留在person
表,而不允许在此处使用它,或者有一个业务规则只允许在其中使用一个电子邮件行contact_info
.这张table也可以用来
company
如果您想存储company
就像contact@somecompany.com 或者公司总机的号码对于表membertype,company\u id和typename是否都应该是pk?
对
地址解决方案的第二次更新:不应该
address
表包含足够的信息,使每个地址都是唯一的,我可以理解一个公司可以有多个地址,但它是否允许两个公司有相同的地址(我的意思是在数据库中的同一行),所以也许它应该改为一对多从company
以及´地址´ 但在另一个方向是一对一。我还认为,在两个地址链接表中添加某种标签也不错,这样人们就可以很容易地识别出“家”、“工作”、“办公室”、“仓库”等地址。。。