Определение всех функциональных зависимостей в наборе данных: объяснение с примерами кода

Чтобы определить все функциональные зависимости в данном наборе данных, вы можете использовать несколько методов. Вот несколько часто используемых методов, а также примеры кода на Python:

  1. Закрытие атрибута:
    Метод закрытия атрибута включает вычисление закрытия каждого набора атрибутов для определения функциональных зависимостей. Вы можете реализовать этот метод, используя подход поиска в ширину (BFS).
def attribute_closure(attributes, functional_dependencies):
    closure = set(attributes)
    updated = True
    while updated:
        updated = False
        for dependency in functional_dependencies:
            x, y = dependency
            if x.issubset(closure) and not y.issubset(closure):
                closure |= y
                updated = True
    return closure
def find_functional_dependencies(attributes, dataset):
    functional_dependencies = set()
    for attr in attributes:
        closure = attribute_closure({attr}, functional_dependencies)
        if closure != attributes:
            functional_dependencies.add((attr, closure - {attr}))
    return functional_dependencies
  1. Аксиомы Армстронга.
    Аксиомы Армстронга предоставляют набор правил вывода для вывода функциональных зависимостей. Вы можете использовать эти аксиомы итеративно, чтобы найти все возможные функциональные зависимости.
def find_functional_dependencies(attributes, dataset):
    functional_dependencies = set()
    for attr in attributes:
        functional_dependencies.add((attr, set()))
    updated = True
    while updated:
        updated = False
        for dependency in functional_dependencies.copy():
            x, y = dependency
            # Augmentation Axiom
            for attr in attributes:
                if attr not in x and attribute_closure(x | {attr}, functional_dependencies) == attributes:
                    functional_dependencies.add((x | {attr}, y))
                    updated = True
            # Transitivity Axiom
            for dependency2 in functional_dependencies.copy():
                if y == dependency2[0]:
                    functional_dependencies.add((x, dependency2[1]))
                    updated = True
    return functional_dependencies
  1. Нормализация базы данных:
    Вы также можете использовать процесс нормализации базы данных для выявления функциональных зависимостей. Разлагая отношение на несколько более мелких отношений, вы можете выявить функциональные зависимости между атрибутами.
# Assuming you have a normalized database schema with separate tables
def find_functional_dependencies(table):
    functional_dependencies = set()
    for column in table.columns:
        functional_dependencies.add((column, set()))
    for column in table.columns:
        closure = attribute_closure({column}, functional_dependencies)
        if closure != table.columns:
            functional_dependencies.add((column, closure - {column}))
    return functional_dependencies