SQL 从具有功能依赖性的数据库架构中查询。正常化

SQL Query from database schema with functional dependences. Normalization

我应该根据给定模式编写 SQL 查询:

这是我写的:

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

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

这是一个建议;

作者(authorID:整数,authorName nvarchar(32),性别:char(1)) 主键(authorID)

发布者(pubID:整数,pubName:nvarchar(32),phone:nvarhcar(16)) 主键(pubID)

图书(bookID:整数,ISBN:nvarchar(32),书名:nvarchar(32),authorID:整数,pubID:整数,出版年份:整数) 主键(bookID, autorID) 外键(authorID) 对作者的引用 外键(pubID) 对发布者的引用。

上周三我完成了期末测试 'Databases'(并且我通过了该测试:-))所以我不是专家。但我认为你会对此很坚定。 是的,您可以添加自己的专栏,尤其是当它促进单一性时。 图书被视为 'weak enitity',这就是为什么主键也引用它的标识实体。

祝你好运,

B

问题来自这样一个事实,即在您的函数依赖项中缺少从 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,并修改函数依赖。