功能依赖和多对多关系

时间:2017-06-08 20:03:05

标签: database functional-dependencies

我有这些字段:

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表也是如此。 我被卡住了。我想我从一开始就做错了什么,然后一切都出错了。也许你有一些例子。

1 个答案:

答案 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。 (即使你出于实现原因而稍后将其归一化。)