【问题标题】:Cardinality and foreign key relationship基数和外键关系
【发布时间】:2015-10-11 03:28:00
【问题描述】:

我是数据库设计的新手,正在尝试了解使用外键的最佳实践。我知道当你有一个 1:m 的关系时,我们不必为这个关系创建一个关系;相反,我们可以在关系的 m 端添加一个外键(对应于 1 端的主键),以保持引用完整性。然而我的问题是:在什么其他情况下我们可以做同样的事情?当我们也有 0..1 对 1 或 1-1 的关系时,我们可以这样做吗?当参照完整性与计算成本一样重要时,这种情况的最佳做法是什么?

【问题讨论】:

  • 有一个外键意味着有一个关系......“这是一个记录,通过这个外键,这个记录的父级”。

标签: mysql database-design relational-database database-schema entity-relationship


【解决方案1】:

当我们将 1:1 关系映射到关系模型时,有三种可能的方法:

  1. 外键方法:选择其中一个关系(例如 S)并包括 Foreign key in S 是 T 的主键。最好选择实体类型 以 S 的角色完全参与 R。

  2. 合并关系选项:1:1 关系类型的替代映射 可以通过将两种实体类型和关系合并到一个 单一的关系。当双方都参与时,这可能是合适的 总计。

  3. 交叉引用或关系关系选项:第三种选择 是建立第三个关系 R 用于交叉引用 表示实体类型的两个关系 S 和 T 的主键。

更多详情可以查看home.iitj.ac.in/~ramana/ch7-mapping-ER-EER-relations.pdf

【讨论】:

  • 您能否详细说明“完全参与”是什么意思?
  • “完全参与”意味着该集合中的每个实体都参与了关系。例如。 “每个”员工应至少为一个部门工作,但每个部门可能有也可能没有员工为其工作。在此实体中,员工将完全参与与实体部门的关系。另请阅读此内容 [stackoverflow.com/questions/19781294/…
【解决方案2】:

外键约束是限制,而不是引用。只要不同的列代表同一个域,并且它们的表可以连接,无论有无外键,关系都隐含地存在。约束只是确保存储在一个列中的值/实体存在于另一列中。它们适用于关系依赖于另一个关系的任何地方,无论两者的基数如何。这里的典型用例是实体集的子类型化。

外键约束的主要好处是通过从单个语句级联更新/删除而不是在执行多个更新/删除之前查询 ID 来实现性能提升(减少网络调用以及开发时间)包裹在事务中的语句。如果更改没有正确传播,更不用说修复时间了。

【讨论】:

    【解决方案3】:

    M-to-M 关系相当于两个 1:M 关系。我们不能将一侧的主键指定为另一侧的外键,为此我们使用一个中间实体来解析 M:M 并且实体通常称为“关联”或交叉实体。例如,项目和员工之间的 M:M 关系可以分配一个新的 midlle 实体,因此这种关系将转换为 1:M,我们可以轻松分配一个外键

    【讨论】:

      猜你喜欢
      • 2012-05-03
      • 1970-01-01
      • 2016-09-24
      • 1970-01-01
      • 2012-10-10
      • 1970-01-01
      • 1970-01-01
      • 2012-02-29
      • 1970-01-01
      相关资源
      最近更新 更多