外键,它们属于哪个关系取决于关系

问题描述:

我已经使用数据库的公平位(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对11至米,并M-到米关系和FK参考?

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

在1对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) 
) 

在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

+0

谢谢先生 - 快速和重点,虽然我会罢工w3schools;根据我的理解,他们已经导致了比他们帮助更多的误入歧途。 – Dan