Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 哪个表应该是父表,哪个表应该是子表?_Database_Database Design - Fatal编程技术网

Database 哪个表应该是父表,哪个表应该是子表?

Database 哪个表应该是父表,哪个表应该是子表?,database,database-design,Database,Database Design,嗨,我有两张桌子和两本书。 我很困惑,应该保留哪个表作为父表,哪个表应该作为子表来进行外键约束 CREATE TABLE author ( author_id NUMBER(3) CONSTRAINT athr_aid_pk PRIMARY KEY, author_name VARCHAR2(30) ); CREATE TABLE books ( book_id NUMBER(3), book_title VARCHAR2(30), book_p

嗨,我有两张桌子和两本书。 我很困惑,应该保留哪个表作为父表,哪个表应该作为子表来进行外键约束

CREATE TABLE author
 (
    author_id NUMBER(3) CONSTRAINT athr_aid_pk PRIMARY KEY,
    author_name VARCHAR2(30)
 );

 CREATE TABLE books
 (
    book_id NUMBER(3),
    book_title VARCHAR2(30),
    book_price NUMBER(3),

 );

请告诉我哪个表应该是父表以及为什么?

您可以将Author设置为父表,将Books设置为子表


原因:一位作者可以写多本书,但一本书(通常)只能由一位作者写。

答案:

原因:这是一种多对多关系。一个作者可以写任意数量的书,一本书也可以有多个作者


解决方案:创建一个包含两列author\u id和book\u id的单独表。这两列都是外键。

我会选择另一种方法,而不是使用父表和子表。 创建一个额外的表,如下所示:

CREATE TABLE authors_books
 (
    author_id NUMBER(3),
    book_id NUMBER(3),
    PRIMARY KEY (`author_id`, `book_id`),
    CONSTRAINT `FK_author_books__author`
        FOREIGN KEY (`author_id`)
        REFERENCES `author` (`author_id`)
        ON DELETE CASCADE
        ON UPDATE CASCADE,
    CONSTRAINT `FK_author_books__book`
        FOREIGN KEY (`book_id`)
        REFERENCES `books` (`book_id`)
        ON DELETE CASCADE
        ON UPDATE CASCADE,
 );
这样,您就可以避免在作者和书籍之间从n到m的关系中遇到任何麻烦。现在一本书也可以由多个作者撰写

您可能希望有一个额外的字段
order
,以便始终保持唯一的PK。因此,主键应该是主键(作者id
图书id
订单
)。
解释1

若你们考虑从一个作者到另一本书的一对多关系,那个么作者就是父母。实际上,作者将是关系的所有者。他将把作者的真实情况映射到书桌上

解释2:


如果你想一想从一个作者到另一本书的多对多关系,那么他们中没有一个是父母。两者的重要性相同。

您已经得到了正确的答案。我想添加技术视图:要添加的列

外键约束意味着表中有一列或一组列可以唯一标识另一个表中的记录

为了在表
author
中的一本书上有一个外键,您需要将
book\u id
添加到该表中。但那没有意义。在这个领域,你会参考作者的哪些书?因此,
books
不能简单地作为关系的父表

然后,您可以将其设置为反之亦然:在表
books
中设置
author\u id
,这意味着一本书只能由一位作者编写。这是否足以满足您的数据库所包含的内容?那么这就是我们要走的路

这些关系是1:n关系(一个作者可以写几本书,或者一本书可以由几个作者写)。但如前所述,一个作者/书籍联盟更典型的是n:m(一个作者可以写几本书,一本书可以由几个作者写)


要在数据库中引入n:m关系,需要添加一个包含两个表ID的桥接表。这个桥接表将引用两个具有外键的父表。

外键声明表示,出现在引用的表的列下的每个值子程序也会出现在被引用表的列下。引用的列必须是唯一的,不能为NULL或主键。“父”表是被引用的表

在这种情况下,声明一个外键。否则不要

如果在两个列列表上进行联接,则每个引用表行的结果正好有一行

对于您的两个表,没有要声明的外键

如果添加一个表
author\u books
包含“author-author\u ID author-book\u ID”所在的行,则其
author\u ID
值必须位于
author
中,其
book\u ID
值必须位于
books中。因此,声明两个外键:

FOREIGN KEY (author_id) REFERENCES author (author_id)
FOREIGN KEY (book_id) REFERENCES books (book_id)
(如果一本书的作者总是只写了一本书,那么你可以使用
作者
的外键将
作者
添加到
作者
。如果一本书总是只有一个作者,那么你可以使用
作者
的外键将
作者id
添加到
书籍中。但这不是作者和作者的真实情况。)书籍。)


约束声明允许DBMS禁止错误的更改,这些更改会使数据库的值不正确(包括UNIQUE NOT NULL、主键或外键)

我同意你的看法。但多个作者也可以为一本书撰稿。@RahulTripathi@SubrataDeyPappu:-是的,这就是为什么我通常添加了
。而且多个作者参与一本书的机会非常少,这是一个有效的解决方案。(你甚至可以在作者表中添加抽象作者,比如写二人组,例如“Kami Garcia&;Margaret Stohl”,这样就可以涵盖一本书的多个作者。只要一个作者和他们在数据库中的合作没有关系,这对你来说都是完美的。)如果允许OP创建一个新的表+1,这是非常有意义的