mysql - 联系人管理数据库设计的建议

标签 mysql sql database innodb

我目前正在为一个商会设计一个联系人管理数据库。数据库的目标是存储所有个人(除了我们自己的员工)、所有记录的公司(正规公司和商会成员(member))、地址 个人和公司、员工当前负责的任务、我们的员工(用户)列表和角色在室内。

<小时/>

业务规则

  • 一个为一家公司工作
  • 一个公司拥有多个人员
  • 公司可以有多个地址
  • 一家公司可以涉足多个行业
  • 一个行业可以拥有多个公司
  • 一个公司可以有多个membertype
  • 一个membertype可以有多个company
  • 一个用户可以扮演多个角色
  • 一个角色可以分配给多个用户
  • 一个用户可以执行多个任务
  • 一个任务可由多个用户处理
  • 一个任务可以针对多个
  • 一个可以被多个任务作为目标
  • 一个只能由一个用户添加
  • 一个用户可以添加多个
  • 一个 company 可以有 0 或 1 个 parent_company
  • 一个 parent_company 可以拥有多个子公司

我提出了以下设计,并进行了一些更改:

enter image description here

问题

  • 是否有更好的方法来显示用户-任务-人员关系?
  • 例如,如果一个只能有一个电子邮件,但可以有多个电话,我是否应该为telemail 仍在 person 表中?会被认为是“不干净的”吗?
  • 对于表 membertypecompany_idtypename 都应该是 PK 吗?
  • 这个架构现在看起来怎么样?是否还需要进行一些标准化工作?
<小时/>

我是数据库新手,肯定存在一些设计缺陷或错误,如果你们能给我一些建议,以便我可以纠正和改进这个设计,那就太好了。谢谢^~^

最佳答案

我看到的主要问题是,虽然所有主键都定义为 Int,但某些外键或引用定义为 varchar。

  1. 联系人表中的公司
  2. 用户表中的user_role
  3. 公司中的parent_company
  4. 在用户表中添加了_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/

相关文章:

mysql - SQL - 遍历 MySQL 中的每一行表?

mysql - 如何选择某些列包含特定数据的列选择具有相同另一列的所有列

sql - 根据条件用上一行的值更新列

mysql - 将表单 INSERT 查询从 Microsoft Access 2007 导出到 MySQL

php - 尝试将 php 运算符作为字符串保存在数据库中

mysql - Doctrine 1 选择具有重复值的列

mysql - SQL 查询字段作为列

javascript - Sequelize - 按降序获取值

sql - 如何在 PrestoSQL 中计算中位数?

mysql - 当新记录出现时,从 mysql 表中移动旧记录