请教一个数据库建表的问题,级联

比如,一个总的表是这样的:

    private Integer id;
    private String name;
    private String corpName;
    private String department;
    private Integer age;
    private Integer status;

现在我要弄一个搜索,先选择 公司名称corpName 再选择 部门名称department

那么再建一个公司名称的表,

private Integer id;
private String corpName;

那么,这公司又包含不同的部门,这个部门的表应该怎么弄呢?
假设再建立一个部门的表,怎么让这个表跟公司表关联呢?每个公司有不同部门

阅读 2.8k
2 个回答

这是多对多的关系模型,也就是说:

  • 一个公司有多个部门

  • 反过来,一个部门可能很多公司都有,比如财务部

多对多的关系需要用三张表来表示

  1. 公司表:(公司编号、公司名…)

  2. 部门表:(部门编号、部门名…)

  3. 关系表:(关系编号、公司编号、部门编号…)

这样你要搜一个公司有什么部门就可以通过关系表来关联查询。

@lijy91 如果用1:N显然在答主的业务里面是会造成数据冗余的,比如A公司有C部门,B公司也有C部门,用1:N的方式部门表就会有两条C部门的纪录,这数据冗余完全是没有必要的。公司+部门产生的对应数据可以称作联系属性,联系属性可以在联系表中添加字段来实现。

建议楼主可以先用E-R图来描述你现在的数据库需求,E-R图能帮助你理解各个表的联系和属性,建起表来也清晰很多。

建议采用 1 : N 的关系来设计,一个公司对应多个部门(不复用部门数据,个人觉得每个公司的部门不尽相同,应该没有必要对部分进行复用,不过还是要看具体需求)。

如果使用 @derekchan 回复里提到的 M : N 来设计,后面如果要对部门信息进行修改,其他公司的相应部门数据也会跟着被修改了。

用公司Id即可以确认部门的数据,下面是一些示例

公司

private Integer id;   // 公司Id
private String name;  // 公司名称

部门

private Integer id;        // 部门Id
private Integer company_id // 公司Id
private String name;       // 部门名称

公司表

id name
1 公司1
2 公司2
3 公司3

部门表

id company_id name
1 1 技术部
2 1 产品部
3 1 运营部
1 2 设计部
2 2 销售部
3 3 技术部
推荐问题