你有两张桌子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),
);
请解释一下哪个表应该是父表,为什么?
答案 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
的外键books
到author
。但这不是作者和书籍的真实情况。)
约束声明允许DBMS禁止会导致数据库具有无法正确的值的错误更改。 You don't need constraints to query a database.(包括UNIQUE NOT NULL,PRIMARY KEY或FOREIGN KEY。)