首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL工作台-关于创建FK关系的问题

MySQL工作台-关于创建FK关系的问题
EN

Database Administration用户
提问于 2013-05-21 13:26:41
回答 1查看 5.9K关注 0票数 2

请原谅我在数据库中遇到了一些新问题,我在使用Workbench时遇到了一些问题。

在一个非常简单的测试数据库中,包含三个表:公司、部门、员工

代码语言:javascript
复制
Company          Department      Employee
 - id (PK)(AI)   - id (PK)(AI)    - id (PK)(AI)
 - Name          - Name           - Name

我在公司和部门之间建立了1比多的关系,因为员工只能有一个部门和一个公司,所以我在公司和员工之间建立了1比多的关系,部门和员工之间建立了1比多的关系。

当我这样做时,Workbench在Employee中创建了第三个关系列,名为Company_Department_id,我所有的包含FK的列现在都已经检查过PK,表现在看起来如下所示:

代码语言:javascript
复制
    Company       Department             Employee
    - id (PK)(AI) - id (PK)(AI)           - id (PK)(AI)
    - Name        - Name                  - Name
                  - Company_id (PK)(FK)   - Company_id (PK)(FK)
                                          - Department_id (PK)(FK)
                                          - Company_Department_id (PK)(FK)

问题

  1. 为什么工作台会自动创建Company_Department_id表?我觉得我应该删除它,但我只想确保我没有遗漏一些东西
  2. Workbench如何将每个相关列自动标记为主键?是因为它们是自己表中的主键吗?我应该把它们作为主钥匙吗?
EN

回答 1

Database Administration用户

回答已采纳

发布于 2013-05-22 02:56:57

看起来,您已经使用该选项创建了一个标识关系(这是工具箱中的一行未中断的关系)。

标识关系假设引用表中的主键应该是引用表的主键的一部分。

因为Company_id现在是部门主键的一部分,它也必须是员工外键的一部分,因此您的问题#1。

你可能想做的是建立一种不确定的关系。这可以通过从工具箱中选择虚线,或者在关系属性的外键选项卡中取消“标识关系”来实现。

非标识关系是典型的外键约束,只需确保引用表中的任何值都存在于引用表中。

从技术上讲,这应该可以解决您的问题,但是底层数据库设计仍然存在潜在的问题。

例如,没有什么可以阻止多个公司以相同的名称存在,或多个部门具有相同的名称,即使在同一家公司内也是如此。

这可以通过添加唯一的密钥约束来解决,但解决相同问题的另一种方法是使用公司和部门名称作为主键。

如果你这样做,你实际上会想要使用一个识别关系,以便公司名称成为部门的一个组成部分。

(您可能希望了解数据库理论和数据库规范化,因为它将帮助您避免在构建数据库时可能遇到的许多陷阱)

我并不是说这是一个更好的数据库设计,只是这是一个标识关系是有效的/有用的。

票数 4
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/42713

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档