http://share.joescott.me/29bd.png
我正在努力解决以下问题,因为标题显示我希望将此表设计转换为表'Book'的有效创建查询
我是否正确地思考:
哪个成为:
CREATE TABLE Book
(
Title varchar(30),
ISBN INT UNIQUE,
Cost dec(8,2),
authorName varchar(30) REFERENCES Author(name),
publisherName varchar(30) REFERENCES Publisher(name)
);
经过上述改动:
CREATE TABLE Book
(
Title varchar(30) NOT NULL,
ISBN INT UNIQUE PRIMARY KEY,
Cost dec(8,2) NOT NULL,
authorName varchar(30) REFERENCES Author(name),
publisherName varchar(30) REFERENCES Publisher(name)
);
答案 0 :(得分:3)
标题应该用作主键吗?
没有。主键应该是唯一的,不变的。没有办法保证没有两本书具有相同的标题。我相信ISBN保证独特且不变,尽管书籍不存在ISBN(书籍尚未完成,书籍在ISBN开始流行之前出版)。
Publisher(名称)上的外键引用publisherName
再次 - 你想要"发行商"的主键。独特,不变。不保证发布商名称是唯一的或不变的。通常,我们会创建" publisherID"作为主键,具有GUID或递增整数。
另一位作者姓名(姓名)
如上所述
另外,我不会包括" numberOfTitles"在发布者表中 - 规范化表明我们需要计算这个值,而不是存储它。
答案 1 :(得分:1)
如果你想从这个糟糕的设计中做到最好,你应该选择第二个选择:
(PK应该是标准的UNIQUE而非NULL)
CREATE TABLE Book (
Title varchar(30) NOT NULL,
ISBN INT PRIMARY KEY,
Cost DECIMAL(8,2) NOT NULL,
authorName varchar(30) REFERENCES Author(name),
publisherName varchar(30) REFERENCES Publisher(name) );
此外,使用此数据集,您的字符长度也很好。但实际上,INT太小,无法存储ISBN的13位数字,名称可以轻松达到40多个字符,尤其是出版商。
答案 2 :(得分:0)
您无需在图书表格中使用重复列(发布商名称,作者姓名)。
只需在发布商和发布商列表中设置主键列(Publisher_Id), (Author_Id)
即可。作者表。在书籍表格中将这些列作为外键引用。然后你可以得到publisher_name& author_name或使用SQL连接的两个表中的任何列。
所以你的书籍表会变成
Book_Id(PrimaryKey) Book_Name Publisher_Id Author_Id
1 C# at a glance 100 21
您可以使用简单的查询,例如
select a.book_name,b.publisher_name,c.author_name from books a
inner join publisher b on a.publisher_id=b.publisher_id
inner join authors c on a.author_id=c.author_id
where a.book_id=1;
不要将book_name设置为主要字段列。相反,您可以使用ISBN
或制作单独的book_id
列。另请参阅数据库规范化&在根据您的要求设计数据库之前,请执行最低3NF的相关表格。 1NF, 2NF, #NF, BCNF Normalization