【问题标题】:Foreign keys, where they belong depending on relationships外键,它们所属的位置取决于关系
【发布时间】:2011-07-04 23:43:58
【问题描述】:

我曾使用过相当多的数据库(MySQL、Oracle),但通常只使用 DML,因为这些系统以前是经过设计的。

我作为唯一的开发人员从事一个项目,负责应用程序开发和 DBA;后者当然证明问题更大。

无论如何 - 我需要刷新外键约束,以及它们在模型中的逻辑位置。鉴于以下情况:

dbc_user
    .user_id INT, Primary Key, Auto Increment
    // arbitrary columns

dbc_user_profile
    .user_id INT, Primary Key
    // arbitrary columns

这些表是 1 对 1 关系。我知道,鉴于这种关系,它们的列可以合并到一个表中,但让我们将它们分开。那么外键属于dbc_user_profile表吗?

多对多呢?

dbc_user
    .user_id INT, Primary Key, Auto Increment

dbc_city
    .city_id INT, Primary Key, Auto Increment

dbc_user_city
    .city_id INT, Primary Key
    .user_id INT, Primary Key

哪些表是引用/被引用的表?

由于某种原因,我似乎找不到一个快速而肮脏的教程来解释这些关系。

所以两部分的问题;

  • 有人可以为半精明的人推荐一个关于外键的 DDL 细节的教程吗?或;
  • 谁能简要介绍一下1-to-11-to-mm-to-m关系和 FK 参考?

【问题讨论】:

    标签: database-design foreign-keys foreign-key-relationship ddl


    【解决方案1】:

    在子表上声明外键并引用父表。

    在一对一的关系中,DBC_USER 似乎是父级,DBC_USER_PROFILE 是子级。因此,您将在DBC_USER_PROFILE 表上声明外键并引用DBC_USER 表。类似(Oracle 语法)

    CREATE TABLE dbc_user_profile (
      user_id int primary key,
      <<more columns>>
      constraint fk_user_profile_user_id foreign key (user_id)
        references dbc_user( user_id )
    )
    

    在一对一的关系中,通常很清楚哪个表是父表,哪个表是子表。父级在子级中有 m 行的 1 行。所以你在子表上声明外键并引用父表。

    CREATE TABLE parent (
      parent_id int primary key,
      <<additional columns>>
    );
    
    CREATE TABLE child (
      child_id int primary key,
      parent_id int references parent( parent_id ),
      <<additional columns>>
    );
    

    对于 m-to-m 关系,外键将在映射表上定义并引用两个父表。所以外键将在DBC_USER_CITY 表上声明,并引用DBC_USERDBC_CITY。类似的东西

    CREATE TABLE dbc_user_city (
      city_id int,
      user_id int,
      constraint pk_dbc_user_city primary key( city_id, user_id ),
      constraint fk_dbc_user_city_city_id foreign key( city_id )
        references dbc_city( city_id ),
      constraint fk_dbc_user_city_user_id foreign key( user_id )
        references dbc_user( user_id )
    )
    

    显然,语法往往是相对特定于数据库的。特别是对于 Oracle,PSOUG site 上有一个非常完整的语法选项列表。对于包含各种数据库语法的更一般的参考,您可以使用w3schools site

    【讨论】:

    • 谢谢你,先生- 快点,虽然我会打击 w3schools;据我了解,他们误入歧途的次数比他们帮助过的要多。
    猜你喜欢
    • 2018-08-04
    • 1970-01-01
    • 1970-01-01
    • 2017-07-24
    • 2014-02-06
    • 1970-01-01
    • 1970-01-01
    • 2015-03-01
    • 2013-09-19
    相关资源
    最近更新 更多