外键,它们所属的位置取决于关系

时间:2011-07-04 23:43:58

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

我曾经使用过数据库( 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对1 1对m m-to-m 关系和FK参考?

1 个答案:

答案 0 :(得分:4)

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

在一对一的关系中,似乎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 )
)

在1到m的关系中,通常很清楚哪个表是父表,哪个表是子表。父项在子项中有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