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

标签 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

这些表是一对一关系。我知道,鉴于这种关系,它们的列可以合并到一个表中,但让我们将它们分开。那么外键属于 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 细节吗?或;
  • 有人可以快速概述一下一对一一对一一对一关系吗和 FK 引用文献?

最佳答案

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

在一对一关系中,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 行。因此,您在子表上声明外键并引用父表。

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>>
);

对于多对多关系,外键将在映射表上定义并引用两个父表。因此,外键将在 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 .

关于database-design - 外键,它们所属的位置取决于关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6576901/

相关文章:

python - Django - 使用属性作为外键

sql - 为什么在 MySQL 中使用外键约束?

c# - 删除级联的 Entity Framework

ios - Restkit - 通过外键进行核心数据一对一关系映射

php - 外键,关系问题

mysql - 私信系统,大单表VS多小表

python - Django最佳用户模型设计

php - InnoDB外键困难?

php - MYSQL 在另一个表中插入一个主键作为外键

asp.net-mvc-3 - ASP.NET 4.3 脚手架 : Add Controller vs Add View - different behavior?