首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在设计表格时实现一对一、一对多、多对多关系?

如何在设计表格时实现一对一、一对多、多对多关系?
EN

Stack Overflow用户
提问于 2011-09-04 09:17:37
回答 2查看 437.7K关注 0票数 359

有没有人能举例说明如何在设计表格时实现一对一、一对多和多对多关系?

EN

回答 2

Stack Overflow用户

发布于 2016-04-15 02:34:43

以下是这些关系类型的一些实际示例:

一对一(1:1)

当且仅当表A中的一条记录与表B中的最多一条记录相关时,关系才是一对一的。

要建立一对一的关系,表B的主键(没有孤立记录)必须是表A的次键(有孤立记录)。

例如:

代码语言:javascript
复制
CREATE TABLE Gov(
    GID number(6) PRIMARY KEY, 
    Name varchar2(25), 
    Address varchar2(30), 
    TermBegin date,
    TermEnd date
); 

CREATE TABLE State(
    SID number(3) PRIMARY KEY,
    StateName varchar2(15),
    Population number(10),
    SGID Number(4) REFERENCES Gov(GID), 
    CONSTRAINT GOV_SDID UNIQUE (SGID)
);

INSERT INTO gov(GID, Name, Address, TermBegin) 
values(110, 'Bob', '123 Any St', '1-Jan-2009');

INSERT INTO STATE values(111, 'Virginia', 2000000, 110);

一对多(1:M)

当且仅当表A中的一条记录与表B中的一条或多条记录相关时,关系才是一对多关系。但是,表B中的一条记录不能与表A中的多条记录相关。

要建立一对多关系,表A(“一”表)的主键必须是表B(“多”表)的次键。

例如:

代码语言:javascript
复制
CREATE TABLE Vendor(
    VendorNumber number(4) PRIMARY KEY,
    Name varchar2(20),
    Address varchar2(20),
    City varchar2(15),
    Street varchar2(2),
    ZipCode varchar2(10),
    Contact varchar2(16),
    PhoneNumber varchar2(12),
    Status varchar2(8),
    StampDate date
);

CREATE TABLE Inventory(
    Item varchar2(6) PRIMARY KEY,
    Description varchar2(30),
    CurrentQuantity number(4) NOT NULL,
    VendorNumber number(2) REFERENCES Vendor(VendorNumber),
    ReorderQuantity number(3) NOT NULL
);

多对多(M:M)

当且仅当表A中的一条记录与表B中的一条或多条记录相关时,关系才是多对多关系,反之亦然。

要建立多对多关系,请创建名为"ClassStudentRelation“的第三个表,该表将同时具有表A和表B的主键。

代码语言:javascript
复制
CREATE TABLE Class(
    ClassID varchar2(10) PRIMARY KEY, 
    Title varchar2(30),
    Instructor varchar2(30), 
    Day varchar2(15), 
    Time varchar2(10)
);

CREATE TABLE Student(
    StudentID varchar2(15) PRIMARY KEY, 
    Name varchar2(35),
    Major varchar2(35), 
    ClassYear varchar2(10), 
    Status varchar2(10)
);  

CREATE TABLE ClassStudentRelation(
    StudentID varchar2(15) NOT NULL,
    ClassID varchar2(14) NOT NULL,
    FOREIGN KEY (StudentID) REFERENCES Student(StudentID), 
    FOREIGN KEY (ClassID) REFERENCES Class(ClassID),
    UNIQUE (StudentID, ClassID)
);
票数 138
EN

Stack Overflow用户

发布于 2020-03-03 03:27:23

一对多

一对多表关系如下所示:

在关系数据库系统中,一对多表关系基于引用父表表行的Primary Key的子表中的Foreign Key列来链接两个表。

在上图中,post_comment表中的post_id列与post表id Primary Key列具有Foreign Key关系:

代码语言:javascript
复制
ALTER TABLE
    post_comment
ADD CONSTRAINT
    fk_post_comment_post_id
FOREIGN KEY (post_id) REFERENCES post

一对一

一对一的表关系如下:

在关系数据库系统中,一对一的表关系基于子表中的Primary Key列链接两个表,该列也是引用父表表行的Primary KeyForeign Key

因此,我们可以说子表与父表共享Primary Key

在上图中,post_details表中的id列与post表的id Primary Key列也具有Foreign Key关系:

代码语言:javascript
复制
ALTER TABLE
    post_details
ADD CONSTRAINT
    fk_post_details_id
FOREIGN KEY (id) REFERENCES post

多对多

多对多表关系如下所示:

在关系数据库系统中,多对多表关系通过子表链接两个父表,子表包含引用两个父表的Primary Key列的两个Foreign Key列。

在上图中,post_tag表中的post_id列与post表id Primary Key列也具有Foreign Key关系:

代码语言:javascript
复制
ALTER TABLE
    post_tag
ADD CONSTRAINT
    fk_post_tag_post_id
FOREIGN KEY (post_id) REFERENCES post

而且,post_tag表中的tag_id列与tag表id的Primary Key列具有Foreign Key关系:

代码语言:javascript
复制
ALTER TABLE
    post_tag
ADD CONSTRAINT
    fk_post_tag_tag_id
FOREIGN KEY (tag_id) REFERENCES tag
票数 31
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7296846

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档