数据库关系模式:求属性集X的闭包,判断依赖关系是否逻辑蕴含,判断无损连接分解

数据库关系模式:求属性集X的闭包,判断依赖关系是否逻辑蕴含 ,判断无损连接分解

结构说明

[“A”,“D”]表示一个依赖关系:A→B

属性集X的闭包,判断依赖关系是否逻辑蕴含

F__ = [["A","D"],["AB","E"],["BI","E"],["CD","I"],["E","C"]] # 依赖集,例如其中["A","D"]表示属性A决定属性BD
X__ = "AE" 

F1 = [["AB","C"],["B","D"],["CD","E"],["CE","GH"],["G","A"]]

def member(FD, F):
    b = instr(FD[1], closure(FD[0], F))
    return b


def closure(x, F):
    """
    :param x: 属性
    :param F: 依赖集
    :return: 属性X的闭包
    """
    result = x
    var = ""
    while not result == var:
        var = result
        for i in range(len(F)):
            if instr(F[i][0], result):
                str = F[i][1]
                result = union(str, result)
    return result

def instr(str1, str2):
    """
    :param str1: 字符串1
    :param str2: 字符串2
    :return: 判断字符串1的每个字符都在字符串2中,若都在,返回true
    """
    b = True
    for j in range(len(str1)):
        if str1[j] not in str2:
            b = False
            break
    return b

def union(str, result):
    """
    :param str: 字符串
    :param result: 字符串
    :return: 求字符串1与字符串2的字符的并集
    """
    for j in range(len(str)):
        if str[j] in result:
            continue
        else:
            result = result + str[j]
    return result
    
print(closure("AB",F1))  # 求属性集AB的闭包,F1为依赖集
print(member(["AB","G"],F1))  # 判断依赖关系["AB","G"]是否逻辑蕴涵于F1

判断无损连接分解

如关系R的依赖集F={A→C,B→C,C→D,DE→C,CE→A};分解ρ={AD,AB,BE,CDE,AE}

构造初始表:以属性X:A,B,C,D,E为行,分解的属性集Y:AD,AB,BE,CDE,AE为列。构造原则是:如果第i行j列满足Xj∈Yi,则值为aj,否则值为bij

ABCDE
ADa1b12b13a4b15
ABa1a2b23b24b25
BEb31a2b33b34a5
CDEb41b42a3a4a5
AEa1b52b53b54a5

修改表:遍历依赖集中的每个依赖
A→C,根据依赖的定义,A的值能确定C的值,因此,A中相同的值所决定的C的值也应该相同,将C对应的位置改为相同,如果C列对应位置没有a则以第一个值为修改值,否则修改为a。

ABCDE
ADa1b12b13a4b15
ABa1a2b23→b13b24b25
BEb31a2b33b34a5
CDEb41b42a3a4a5
AEa1b52b53→b13b54a5

同理,对B→C

ABCDE
ADa1b12b13a4b15
ABa1a2b23→b13b24b25
BEb31a2b33→b13b34a5
CDEb41b42a3a4a5
AEa1b52b53→b13b54a5

C→D

ABCDE
ADa1b12b13a4b15
ABa1a2b23→b13b24→a4b25
BEb31a2b33→b13b34→a4a5
CDEb41b42a3a4a5
AEa1b52b53→b13b54→a4a5

DE→C

ABCDE
ADa1b12b13a4b15
ABa1a2b23→b13b24→a4b25
BEb31a2b33→b13→a3b34→a4a5
CDEb41b42a3a4a5
AEa1b52b53→b13→a3b54→a4a5

CE→A

ABCDE
ADa1b12b13a4b15
ABa1a2b23→b13b24→a4b25
BEb31→a1a2b33→b13→a3b34→a4a5
CDEb41→a1b42a3a4a5
AEa1b52b53→b13→a3b54→a4a5

至此,修改完毕,如果存在全为a的行,如本例第三行,则该分解为无损分解

判断分解是否保持函数依赖

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cshgiser

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值