我正在阅读Teorey,Simison等人的“数据库设计”一书。在某一点上,它解释了如何将具有多值属性的实体映射到关系表中。示例如下,其中多值属性是业余爱好。
Employee(Employee_ID(PK),name,surname,hobby)
导致两个表
Employee(Employee_ID(PK),name,surname)
Hobby(Employee_ID(PK),hobby(PK))
本书或多或少地说“给定具有主键p的实体E,附加到ER图的多值属性E被映射到其自己的表,其中主键由p和属性值组成( s)“。这是一般规则吗? 使用多值属性书来跟上关系。
Author(Author_ID(PK),name,book)
创建下面的两个表是不够的,其中书的PK只是Book_ID而Author_ID是FK而没有成为Book的PK的一部分?
Author(Author_ID(PK),name)
Book(Book_ID,book,Author_id(FK))
答案 0 :(得分:0)
你是对的;你不能 在Hobby或Book中使用复合主键,但如果你愿意,你当然可以。 this question接受的答案很好地概述了您何时可能想要使用其中一个。
顺便说一句,如果你真的要实现你的例子,你可能想要三个表:Author,Book和它们之间的associative entity,因为作者可能会写很多书和一本书可能有很多作者。
答案 1 :(得分:0)
创建下面的两个表是不够的,其中书的PK只是Book_ID而Author_ID是FK而没有成为Book的PK的一部分?
你错误地认为候选键{book_id}已经足够了,因为只有当作者集不重叠时才会这样。如果它们重叠,则需要{book_id,author_id}。
虽然新PK必然是两列的组合,但您的书是错误的。 (同样,如果员工的爱好不重叠,那么hobby_id就是Hobby的候选键。)所以本书的列转换是正确的,但你必须自己确定每个新表的候选键。
请参阅this answer关系设计。