Sahithyan's S3 — Database Systems
Attribute Sets
Closure
Given a set of attributes and a set of functional dependencies , the closure of with respect to , denoted , is the set of all attributes that are functionally determined by according to . Formally:
where and and .
Algorithm
def attribute_closure(attributes, fds): """ Compute the closure of a set of attributes with respect to a set of functional dependencies.
:param attributes: set of attribute strings, e.g. {'A', 'B'} :param fds: list of tuples (lhs, rhs), where lhs and rhs are sets of attributes e.g. [({'A'}, {'B'}), ({'B'}, {'C'})] :return: set of attributes in the closure """ closure = set(attributes) changed = True while changed: changed = False for lhs, rhs in fds: if lhs.issubset(closure) and not rhs.issubset(closure): closure.update(rhs) changed = True return closure