# 从功能依赖关系中确定密钥[英] Determine Keys from Functional Dependencies

### 问题描述

```AB → C
CD → E
EF → G
FG → E
DE → C
BC → A
```

```a. BCDEF
c. BDFG
d. BCDE
```

## 推荐答案

http://rayrymondcho.net/remondcho.net/relationdatabasetools/relationaldatabasetools/relealationaldatabasetoolationaltionaldatabasetoolationaldatabasetools

## 其他推荐答案

1. 列出您建议的密钥中未使用的所有属性(因此BCDEF不包括A和G).
2. 对于您所缺少的每个属性，浏览函数依赖项列表，看看您的提议键是否能够推断您缺少的属性.

```             a. So for A, you have BC -> A.  Since both B and C are in the proposed
key BCDEF, you can infer that BCDEF -> A.  Your set now becomes
BCDEFA.
b. For G, again going through your FDs you find EF -> G.  Since both
E and F are in BCDEFA, you can infer BCDEFA -> G.
```

### 问题描述

I'm taking a database theory course, and it's not clear to me after doing the reading how I can infer keys, given a set of functional dependencies.

I have an example problem:

Find all keys of the relation R(ABCDEFG) with functional dependencies

```AB → C
CD → E
EF → G
FG → E
DE → C
BC → A
```

Demonstrate your knowledge by identifying which of the following is a key.

```a. BCDEF
c. BDFG
d. BCDE
```

Can someone walk me through how I should decompose the functional dependencies to conclude that some combination of attributes is a key? I expect I'll face a number of these types of problems and I need to understand how to approach it.

## 推荐答案

Take an FD, e.g. AB→C

Augment until all attributes are mentioned, e.g. ABDEFG → CDEFG (note that this is equivalent to ABDEFG → ABCDEFG because it is trivially true that A->A and B->B).

This tells you that ABDEFG is a superkey.

Check the other FDs in which the LHS is a subset of your superkey, and that on its RHS contains some other attribute of your superkey.

There are two. EF→G and FG→E. Remove the attributes of the RHS of these from your superkey. Doing so gives you two keys, that are certainly superkeys, but not necessarily irreducible ones: ABDEF and ABDFG.

However, from AB→C and CD→E we can also derive that ABD→E. Hence we can also remove the E from our ABDEF key. The nasty thing here is that when I said "Check the other FDs", that apparently means that you should also check any FD that appears in the closure of your set of FDs (i.e. any FD that is derivable from your given set of FDs)... And that's a bit impractical to do by hand ...

A useful site for verifying whether your results are correct:

http://raymondcho.net/RelationalDatabaseTools/RelationalDatabaseTools

You should now be able to determine that option c is a key.

## 其他推荐答案

Well this should be rather straightforward. All you need to do is to take the closure of every key given and see if it contains all attributes of R. For example, closure of BCDEF = ABCDEFG since BC -> A and BC is a subset of BCDEF and so if EF for FD EF -> G. Since this closure contains all attributes of R, BCDEF is the key. The main aim of taking closures is to see if we can "reach" every attribute from a given set of attributes. The closure is the set of attributes that we can actually reach by navigating the FDs.

## 其他推荐答案

Since you're in a db theory course, I'm going to assume you have SQL experience and try and relate the theory to the implementation context.

Basically, a relation is what you would refer to as a table in implementation and a key is ANY set of attributes (read columns) which can be used to identify a UNIQUE row (in db theory this would be a tuple). The simplest analogy here is that a key is your primary key, as well as any other possible set of columns you can use to identify a single tuple in your relation (row in your table). So, here are the basic steps for doing this (I'll walk through example A, and then you can try the rest):

1. List all of the attributes which are NOT in your proposed key (so BCDEF does not include A and G).
2. For each attribute you're missing, go through the list of functional dependencies and see if your proposed key is capable of inferring the attribute you're missing.

```             a. So for A, you have BC -> A.  Since both B and C are in the proposed
key BCDEF, you can infer that BCDEF -> A.  Your set now becomes
BCDEFA.
b. For G, again going through your FDs you find EF -> G.  Since both
E and F are in BCDEFA, you can infer BCDEFA -> G.
```

Because you were able to infer both A and G from BCDEF, option a is a key of the relation ABCDEFG. I know there is an algorithm for this, and it is probably in your course text somewhere. There is also probably an example. You should step through it manually until the pattern is intuitive.

EDIT: The reason I would go back through the text to look for this algorithm is that chances are your exam is going to be written as opposed to multiple choice since it is a db theory course. If this is true then you would get more partial credit if you can methodically follow notation demonstrated in your course text/notes.

The main goal is to turn the key into the relation, which should prove that the proposed key is in fact a key.