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,这是非常有意义的