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

时间:2016-02-10 11:30:05

标签: database database-design

你有两张桌子Auther和Books。 我很困惑,我应该保留哪个表作为父表,哪个应该是用于制作外键约束的子表。

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

 );

请解释一下哪个表应该是父表,为什么?

6 个答案:

答案 0 :(得分:5)

答案:无。

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

解决方案:创建一个包含两列author_id的单独表,book_id都是外键。

答案 1 :(得分:2)

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

外键约束意味着您在表中有一列或一组列,用于唯一标识另一个表中的记录。

为了在表File->Import Module->"Select the external library"->Finish中的图书上设置外键,您需要将author添加到该表中。但这没有意义。 你会在这个领域中引用哪些作者的书?所以book_id根本不能成为关系的父表。

然后你可以反过来:在表books中有author_id,这意味着一本书只能由一位作者写。这是否足以满足您的数据库要包含的内容?那么这就是你要走的路。

这些提到的关系是1:n关系(一个作者可以写几个 一个书可以由几位作者撰写)。但如上所述,作者/书籍的典型形式是n:m(一个作者可以写几个书籍 一本书可由几位作者撰写)。

要在数据库中引入n:m关系,请添加包含两个表的ID的桥接表。此桥接表将使用外键引用两个父表。

答案 2 :(得分:1)

您可以将Author作为父表,将Books作为子表。

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

答案 3 :(得分:1)

我会采用另一种方法,而不是拥有父表和子表。 创建一个这样的额外表:

<dependency>
    <groupId>org.jboss.resteasy</groupId>
    <artifactId>resteasy-jaxrs</artifactId>
    <version>3.0.12.Final</version>
</dependency>

<dependency>
    <groupId>org.jboss.resteasy</groupId>
    <artifactId>jaxrs-api</artifactId>
    <version>3.0.12.Final</version>
</dependency>

<dependency>
    <groupId>org.jboss.resteasy</groupId>
    <artifactId>resteasy-jaxb-provider</artifactId>
    <version>3.0.12.Final</version>
</dependency>

<dependency>
    <groupId>org.jboss.resteasy</groupId>
    <artifactId>resteasy-jackson2-provider</artifactId>
    <version>3.0.12.Final</version>
</dependency>

通过这种方式,您可以避免与作者和书籍之间的n到m关系出现任何问题。现在一本书也可以由多位作者撰写。

你可能想要一个额外的字段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, ); 以便始终保持一个独特的PK。因此PK将是order author_id PRIMARY KEY ( book_id ,订单,

答案 4 :(得分:0)

解释1

如果你考虑从作者到书的一对多关系,那么作者将是父母。实际上作者将是这段关系的所有者。他将把作者的实际情况映射到书籍表。

解释2:

如果你想到从作者到书本的多对多关系,那么没有一个是父母。两者都具有同等重要性。

答案 5 :(得分:0)

FOREIGN KEY声明表示在REFERENCES表中列出的列下显示的每个值的子列也出现在引用表的列出列中。引用的列必须是UNIQUE NOT NULL或PRIMARY KEY。 &#34;父母&#34; table是引用的。

无论何时发生这种情况,都要声明一个外键。否则不要。

如果你在两个列列表上加入,那么每个引用表行的结果只有一行。

使用你的两张桌子,没有外键可以申报。

如果您添加一个表author_books,其中包含&#34;作者AUTHOR_ID创作的书BOOK_ID&#34;然后,其author_id值必须位于author且其book_id值必须位于books。所以声明两个FOREIGN KEYs:

FOREIGN KEY (author_id) REFERENCES author (author_id)
FOREIGN KEY (book_id) REFERENCES books (book_id)

(如果作者总是只写一本书,那么您可以使用book_id的外键将author添加到books。如果一本书总是只有一位作者,那么您可以添加来自author_id的外键booksauthor。但这不是作者和书籍的真实情况。)

约束声明允许DBMS禁止会导致数据库具有无法正确的值的错误更改。 You don't need constraints to query a database.(包括UNIQUE NOT NULL,PRIMARY KEY或FOREIGN KEY。)