SQL 从具有功能依赖性的数据库架构中查询。正常化
SQL Query from database schema with functional dependences. Normalization
我应该根据给定模式编写 SQL 查询:
BookAuthors
(ISBN, authorName, gender, title, yearPublished, pubId, pubName, phone)
FD
= { ISBN -> title, pubId, yearPublished;作者姓名 -> 性别; 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)
);
这是正确答案吗?我担心作者和书之间没有任何联系。
这是一个建议;
作者(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,并修改函数依赖。
我应该根据给定模式编写 SQL 查询:
BookAuthors
(ISBN, authorName, gender, title, yearPublished, pubId, pubName, phone)FD
= { ISBN -> title, pubId, yearPublished;作者姓名 -> 性别; 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)
);
这是正确答案吗?我担心作者和书之间没有任何联系。
这是一个建议;
作者(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,并修改函数依赖。