具有功能依赖性的数据库模式的SQL查询。正常化

时间:2016-01-24 19:12:11

标签: sql sql-server database-normalization sql-server-2014-express

我应该从给定的架构中编写SQL查询:

  • BookAuthors(ISBN,authorName,性别,标题,yearPublished,pubId,pubName,phone)
  • FD = {ISBN - > title,pubId,yearPublished; authorName - >性别; pubId - > pubName,phone}

这是我写的:

CREATE TABLE Authors
(
    authorName VARCHAR(64) PRIMARY KEY,
    gender CHAR(1)
);

CREATE TABLE Publishers
(
    pubId VARCHAR(32) PRIMARY KEY,
    pubName VARCHAR(64),
    phone NUMERIC(10)
);
GO

CREATE TABLE Books
(
    ISBN VARCHAR(32) PRIMARY KEY NOT NULL,
    title VARCHAR(32),
    pubId VARCHAR(32) FOREIGN KEY REFERENCES Publishers(pubId) NOT NULL,
    yearPublished NUMERIC(4)
);

这是正确的答案吗?我担心作者和书之间没有任何联系。

2 个答案:

答案 0 :(得分:0)

这是一个建议;

作者(authorID:integer,authorName nvarchar(32),gender:char(1)) 主键(authorID)

发布商(pubID:integer,pubName:nvarchar(32),phone:nvarhcar(16)) 主键(pubID)

图书(bookID:整数,ISBN:nvarchar(32),title:nvarchar(32),authorID:integer,pubID:integer,yearPublished:integer) 主键(bookID,autorID) 外键(authorID)引用作者 外键(pubID)对发布者的引用。

上周三我完成了我的最终测试'数据库'(我通过了测试:-))所以我不是专家。但我认为你会坚定不移。 是的,你可以添加自己的列,特别是如果它促进了单一性。 本书被认为是一种“弱势”,这就是为什么主键也引用它的识别实体。

祝你好运,

答案 1 :(得分:0)

问题来自这样一个事实:在你的功能依赖中缺少从ISBN到AuthorName的依赖:这是因为每本书都唯一地确定了它的作者。所以依赖应该是:

ISBN -> title, pubId, yearPublished,  authorName
authorName -> gender
pubId -> pubName, phone

所以,第三种正常形式如下:

Books(ISBN authorName pubId title yearPublished) ,
{ ISBN → authorName pubId title yearPublished } >

Authors (authorName gender) ,
{ authorName → gender } >

Publishers (pubId pubName phone) ,
{ pubId → pubName phone } >

这应该是要定义的关系集。当然,您应该添加正确的约束,例如主键和外键(IrateB的解决方案也是正确的)。

我认为这是一个练习,否则,您应该将AuthorId添加到原始数据中,并修改功能依赖项。