从表设计转换为SQL创建查询?

时间:2014-08-21 11:47:21

标签: sql oracle

http://share.joescott.me/29bd.png

我正在努力解决以下问题,因为标题显示我希望将此表设计转换为表'Book'的有效创建查询

我是否正确地思考:

  • 标题应该用作主键吗?
  • 发布商(名称)
  • 上的外键引用publisherName
  • 作者(姓名)
  • 上的另一位作者姓名

哪个成为:

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

3 个答案:

答案 0 :(得分:3)

  

标题应该用作主键吗?

没有。主键应该是唯一的,不变的。没有办法保证没有两本书具有相同的标题。我相信ISBN保证独特且不变,尽管书籍不存在ISBN(书籍尚未完成,书籍在ISBN开始流行之前出版)。

  

Publisher(名称)上的外键引用publisherName

再次 - 你想要"发行商"的主键。独特,不变。不保证发布商名称是唯一的或不变的。通常,我们会创建" publisherID"作为主键,具有GUID或递增整数。

  

另一位作者姓名(姓名)

如上所述

另外,我不会包括" numberOfTitles"在发布者表中 - 规范化表明我们需要计算这个值,而不是存储它。

答案 1 :(得分:1)

如果你想从这个糟糕的设计中做到最好,你应该选择第二个选择:

  • 使用PK'名称'表格[发布者]。
  • 表[作者]与PK'姓名'。
  • 表[书]与PK' ISBN'和FK [出版商] .Name和另一个FK [作者] .Name。

(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