我目前正在为一个商会设计一个联系人管理数据库。数据库的目标是存储所有个人(除了我们自己的员工)、所有记录的公司(正规公司和商会成员(member))、地址 个人和公司、员工当前负责的任务、我们的员工(用户)列表和角色在室内。
<小时/>业务规则
- 一个
人
为一家公司
工作 - 一个
公司
拥有多个人员
人
和公司
可以有多个地址
- 一家
公司
可以涉足多个行业
- 一个
行业
可以拥有多个公司
- 一个
公司
可以有多个membertype
- 一个
membertype
可以有多个company
- 一个
用户
可以扮演多个角色
- 一个
角色
可以分配给多个用户
- 一个
用户
可以执行多个任务
- 一个
任务
可由多个用户
处理 - 一个
任务
可以针对多个人
- 一个
人
可以被多个任务
作为目标 - 一个
人
只能由一个用户
添加 - 一个
用户
可以添加多个人
- 一个
company
可以有 0 或 1 个parent_company
- 一个
parent_company
可以拥有多个子公司
我提出了以下设计,并进行了一些更改:
问题
- 是否有更好的方法来显示
用户-任务-人员
关系? - 例如,如果一个
人
只能有一个电子邮件
,但可以有多个电话
,我是否应该为tel
而email
仍在person
表中?会被认为是“不干净的”吗? - 对于表
membertype
,company_id
和typename
都应该是 PK 吗? - 这个架构现在看起来怎么样?是否还需要进行一些标准化工作?
我是数据库新手,肯定存在一些设计缺陷或错误,如果你们能给我一些建议,以便我可以纠正和改进这个设计,那就太好了。谢谢^~^
最佳答案
我看到的主要问题是,虽然所有主键都定义为 Int,但某些外键或引用定义为 varchar。
- 联系人表中的公司
- 用户表中的user_role
- 公司中的parent_company
- 在用户表中添加了_by
此外,role_id 的长度为 10,而所有其他主键的长度均为 11。
就我个人而言,我更喜欢大写的表名、用户、公司等
已编辑版本的更新:
您可能想要为电话、邮件、传真等创建一个表,比如contact_info
,其中可能包含一个保存联系信息的字符串字段和一个类型字段(电子邮件、电话、传真... )。通过这种方式,您可以存储多个电话号码,例如,如果您想将电子邮件限制为一个,您可以将其保留在 person
表中并且不允许在此处使用,或者使用业务规则仅允许一封电子邮件contact_info
中的行。
如果您想存储公司
的电子邮件或电话号码(例如 contact@somecompany.com 或公司总机的号码),则此表对于公司
也很有用
For the table membertype, should company_id and typename both be PK?
是的
第二次更新
关于地址解决方案:
address
表不应该包含足够的信息来使每个地址唯一,我可以理解一家公司可以有多个地址,但是否应该允许两家公司拥有相同的地址(通过我表示数据库中的同一行),因此也许应该将其更改为来自 company
和“地址”的一对多,但在另一个方向上是一对一。
我还认为在两个地址链接表中添加某种标签可能会很好,这样人们就可以轻松识别“家庭”、“工作”、“办公室”、“仓库”等地址......
关于mysql - 联系人管理数据库设计的建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50133107/