我有这些字段:
A book_id
B book_title
C book_isbn
D book_year
G reader_id
H reader_name
I reader_birthday
L reader_phone
M reader_email
N reader_registration_date
O loan_id
P loan_date_issued
S loan_date_for_return
T loan_date_returned
U author_id
V author_name
W category_id
X category_name
和这些依赖项:
A->BCD
G->HILMN
O->AGPST
U->AV
W->AX
在所有计算之后我得到了这个:
R1 = ABCD k1 = {A} Books
R2 = GHILMN k2 = {G} Readers
R3 = AGOPST k3 = {O} Loans
R4 = AUV k4 = {U} Authors
R5 = AWX k5 = {W} Category
R6 = OUW k6 = {OUW} {Don’t know}
但这并不好,因为table Book与表Category有很多关系,Book和Author表也是如此。 我被卡住了。我想我从一开始就做错了什么,然后一切都出错了。也许你有一些例子。
答案 0 :(得分:1)
让我们将“类别”视为“书籍”的“封面” - “对象”或“书”的“副本” - 文本,其中“书”与其独有的某些O值相关联。那么W - > A更直观。 (其他FD似乎也不直观。)
普遍关系
每个表(基本或查询结果)都有一个谓词(语句模板),一行将其作为一个真实的语句(并在表中)或一个假语句(并保持不变)。我们说该表代表以谓词为特征的业务关系/关联。这里对谓词的猜测是:
book A titled B with isbn C published in year D
was borrowed by a reader G named H born on date I
with phone# L and email address M registered on date N
in loan O issued on date P due on date S
and either it was returned on date T or it is not yet returned and T=NULL
and it was written by author U named V
and the library has A in cover/copy W named X
您似乎正在使用“通用关系”分解设计/规范化技术。但这仅适用于您的一个表满足“通用关系假设”的情况。这可以通过一个谓词及其一个表来描述所有情况。
例如:假设您可以拥有未借出的书籍或未借用的用户。然后上面的示例谓词/表格无法记录它们。因此分解将无法记录它们。所以你宁愿从另一个谓词/表开始。 (通常是多个。)
例如:如果最后一行是and A was borrowed in cover/copy W named X
,则表格在给定情况下可以保持与以前不同的值。但根据借款政策,该表可以满足同一组FD。
这个表的谓词是什么?如果这不是你所猜测的,那么你的期望可能就不会得到满足。
您的分解
让我们忽略实体的属性。
-- O is G borrowing A by U with W
A book_id
G reader_id
O loan_id
U author_id
W cover/copy_id
O->AG
U->A
W->A
唯一的CK是OUW。这是对BCNF的明显分解。它同意你的版本。
-- O is G borrowing A by someone with some cover/copy
-- O is G borrowing A
Loan(O,G,A)
-- some loan is somebody borrowing A by U with some cover/copy
-- the book of U is A
The_book_of_author(U,A)
-- some loan is somebody borrowing A by someone with W
-- the book of W is A
The_book_of_cover/copy(W,A)
-- O is somebody borrowing some book by U with W
-- O is the borrowing of the book of U and W
Author_and_cover/copy(O,U,W)
原始关系是组件的连接:
-- O is G borrowing A
and the book of U is A
and the book of W is A
and O is the borrowing of the book of U and W
-- O is G borrowing A by U with W
Loan JOIN The_book_of_author JOIN The_book_of_cover/copy JOIN Author_and_cover/copy
这不好,因为table Book与表Category有很多关系,Book和Author表也有很多关系
不幸的是,这是难以理解的。所以我无法解决你所说的错误。
数据库设计
如果您自己生成此设计,则应使用一些参考信息建模方法。这将指导您确定合理的谓词/表格,以记录根据您的业务规则可能出现的所有情况。
应用于可能出现的情况的谓词决定了可能出现的状态。这些有效状态由约束描述 - FD(功能依赖性),JD(连接依赖性),CK(候选键),FK(外键)(也称为“不同意义上的”关系“)等。
方法的一部分是将临时表规范化为其他人。这使用FD& JD通过适当的算法分解为适当的NF(正规形式)。一个好的方法总是标准化为5NF。 (即使你出于实现原因而稍后将其归一化。)