# How to Identify Keys and Superkeys in Functional Dependencies

Functional dependencies (FDs) are foundational concepts in database theory and design. They describe how attributes in a relational database are related to each other, dictating how one set of attributes determines another. Understanding FDs is crucial for tasks such as normalization, which helps in minimizing redundancy and avoiding anomalies in databases. Mastering these concepts is not only essential for creating efficient database schemas but also for excelling in database homework. This blog will provide a comprehensive guide to analyzing FDs, deriving keys and superkeys, and validating functional dependency rules using various methods. Whether you are tackling a functional dependency assignment or looking to deepen your understanding of relational database design, this guide will help you navigate through the complexities and apply these concepts effectively in real-world scenarios.

## Understanding Functional Dependencies

Functional dependencies define the constraints between attributes in a relation. An FD, X→ Y, implies that if two tuples (rows) of a relation have the same values for attributes in set X, they must also have the same values for attributes in set Y. For instance, if A→B , then knowing the value of A allows us to determine the value of B.

## Deriving Nontrivial Functional Dependencies

To understand nontrivial functional dependencies, let's consider a relation R(A,B,C,D) with the following FDs:

- AB→ C
- C→D
- D→ A

### Step 1: Identify Nontrivial FDs

Nontrivial FDs are those where the right side of the FD is not a subset of the left side.

**1. From AB→ C:
**

- We can infer A→C and B→C because if AB can determine C, then knowing A or B alone should be checked if it can also determine C.

**2. From C→D:
**

- This FD is already in the required form where C determines D, and this is nontrivial.

**3. From D→ A:
**

- Similarly, this FD is in the form where D determines A.

So, the nontrivial FDs with single attributes on the right side are:

- A→C
- B→C
- C→D
- D→ A

## Identifying Keys and Superkeys

### Step 2: Determine Keys

A key for a relation is a minimal set of attributes that can uniquely identify a tuple in the relation. To find the key(s), we need to check attribute combinations that can determine all other attributes in the relation.

**1. Closure of AB:
**

- Compute the closure of AB:
- AB→ C
- C→D
- D→ A

Hence, AB determines all attributes in the relation R (i.e., A,B,C,D). Thus, AB is a key.

**2. Checking other combinations:
**

- To verify if other combinations are keys, compute their closures and see if they cover all attributes. For instance:
- The closure of A alone does not include B, C, and D.
- Similarly, B alone does not determine A, C, and D.

Thus, the only minimal key for R is AB.

### Step 3: Identifying Superkeys

Superkeys are attribute sets that can determine all attributes but may not be minimal. To find superkeys that are not keys, include additional attributes beyond the minimal key.

**For example:
**

- A,B, C and A,B, D are superkeys because they include the key AB and additional attributes, but they are not minimal.

## Applying Techniques to Different Schemas

Let's explore different schemas with their respective FDs to see how the principles apply:

**Schema S(A,B,C,D) with FDs:
**

- A→B
- B→C
- B→ D

**1. Nontrivial FDs:
**

- From A→B , we can infer B→C and B→ D as they are already in the required form.

**2. Finding Keys:
**

- To determine keys:
- Compute the closure of B:
- B→C
- B→ D
- Since B alone determines C and D, and with A leading to B, B is the key.

**3. Superkeys that are not Keys:
**

- Superkeys that are not minimal keys include A ,B, although B alone is sufficient to determine all attributes.

**Schema T(A,B,C,D) with FDs:
**

- AB→ C
- BC→ D
- CD→ A
- AD→ B

**1. Nontrivial FDs:
**

- All given FDs are nontrivial as the right side attributes are not subsets of the left side.

**2. Finding Keys:
**

- To find keys, check combinations that cover all attributes:
- For instance, AD determines B and other attributes via closure.

**3. Superkeys that are not Keys:
**

- Examples include A,B, C, which could be a superkey but is not minimal.

**Schema U(A,B,C,D) with FDs:
**

- A→B
- B→C
- C→D
- D→ A

**1. Nontrivial FDs:
**

- Each FD is nontrivial, as the right-side attributes are not subsets of the left side.

**2. Finding Keys:
**

- Since each attribute can determine all others in a cyclical manner, any combination that includes all attributes will serve as a key.

**3. Superkeys that are not Keys:
**

- Any set of attributes containing all attributes will be a superkey.

## Validating Functional Dependency Rules

### Augmenting Left Sides:

**Rule:**If A1A2…An→ B, then A1A2…AnC→ B.**Proof:**Adding additional attributes to the left side of a functional dependency does not change the dependency.

### Full Augmentation:

- Rule: If A1A2…An→ B, then A1A2…AnC→ BC.
- Proof: By adding attributes to the left side, you can also add them to the right side as the dependency remains valid.

### Pseudotransitivity:

**Rule:**If A1A2…An→B1B2…BmBm and C1C2…Ck→ D, where B are among C, then A1A2…AnE1E2…Ej→ D, where E are C not in B.**Proof:**By eliminating the common attributes in C from B, the remaining attributes E along with A still determine D.

### Addition:

**Rule:**If A1A2…An→B1B2… p and C1C2…Ck→D1D2…D j, then A1A2…AnC1C2…Ck→B1B2…BpD1D2… Dj.**Proof:**Combining attributes on the left side of an FD with attributes on the right side maintains the dependency.

## Validating Functional Dependency Rules

### Invalid Rules with Examples:

**1. If A→B then B→ A.
**

**Counterexample:**Consider A={1,2},B={1}. Here, A→B holds, but B→A.

**2. If AB→ C and A→C , then B→C .
**

**Counterexample:**For A={1},B={2},C={3 }, if AB→ C.

## Discovering Functional Dependencies from Closed Sets

Understanding how closed sets of attributes can reveal functional dependencies is a critical skill. Let’s explore how to infer FDs based on closed sets of attributes.

### a) All sets of four attributes are closed:

If all sets of four attributes are closed in a relation R(A,B,C,D), it means that the full set of attributes can determine every other attribute. This scenario indicates that every attribute combination can uniquely identify all attributes within the relation.

**FDs:** In this case, you can infer that all possible functional dependencies hold because any subset of attributes can determine the rest. For instance:

- A→B
- B→C
- C→D
- A→C
- And so forth.

### b) The only closed sets are ∅ and {A,B,C,D }:

When the only closed sets are the empty set and the full set of attributes, it suggests that no non-trivial dependencies exist apart from those implied by the full set of attributes. Here’s how to infer the FDs:

**FDs:** The only dependencies are those where one attribute can determine the others when combined with the full set. For example:

- If {A,B}→{C,D } and other combinations that cover all attributes could be inferred.

### c) The closed sets are ∅, { A,B}, and {A,B,C,D }:

If the closed sets are ∅, { A,B}, and {A,B,C,D }, it indicates specific dependencies among attributes. The closed set {A,B } being closed suggests that these two attributes together can determine the rest.

**FDs:** Based on the closed sets, you can infer:

- A,B→C,D
- This implies A→C and B→C , but not necessarily individually.

## Conclusion

Functional dependencies play a vital role in the design and normalization of relational databases. By understanding and applying the concepts of functional dependencies, keys, and superkeys, you can effectively design robust databases and solve complex assignments related to relational database theory.

In summary:

- Derive nontrivial FDs by analyzing the given dependencies and infer additional ones.
- Identify keys by finding minimal attribute sets that determine all others.
- Determine superkeys as sets that include keys but with additional attributes.
- Validate rules using the closure test to ensure the accuracy of functional dependencies.
- Discover FDs from closed sets to infer the underlying relationships in a relation.

These techniques and principles will help you in analyzing functional dependencies, solving related assignments, and enhancing your understanding of database design. With practice and application, you'll become proficient in managing and designing relational databases.