45

Functional Dependencies An example: loan-info= Observe: tuples with the same value for lno will always have the same value for amt We write: lno amt

Embed Size (px)

Citation preview

Page 1: Functional Dependencies An example: loan-info= Observe: tuples with the same value for lno will always have the same value for amt We write: lno  amt
Page 2: Functional Dependencies An example: loan-info= Observe: tuples with the same value for lno will always have the same value for amt We write: lno  amt

Functional DependenciesFunctional DependenciesAn example:

loan-info=

bname lno cname amt

Downtown L-170 Jones 1000 Downtown L-170 Smith 1000 Redwood L-230 Turner 1000 Perry L-234 Hayes 1500 Redwood L-13 Johnson 1000

Observe: tuples with the same value for lno will always have the same value for amt

We write: lno amt (lno “determines” amt, or amt is functional determined by lno)

True or false?

amt lno? lno cname? lno bname? bname lno?

can’t always decide by looking at populated db’s

Page 3: Functional Dependencies An example: loan-info= Observe: tuples with the same value for lno will always have the same value for amt We write: lno  amt

Functional DependenciesFunctional DependenciesIn general:

A1 A2 .... An Bset of attributes single attribute

Formally: if 2 tuples “agree” on their values for A1, A2,...,An they will also agree on their values for B

Formally:

t, u: (t[A1] = u[A1] t[A2] = u[A2] .... t[An] = u[An] ) => t[B] = u[B]

Page 4: Functional Dependencies An example: loan-info= Observe: tuples with the same value for lno will always have the same value for amt We write: lno  amt

Back to Global ICBack to Global IC’’ssHow do we decide what constraints to impose?

Consider loan-info(bname, lno, cname, amt) with FDs: lno bname

How do we ensure that lno bname?

CREATE ASSERTION lno-bname CHECK ( NOT EXIST (SELECT * FROM loan-info l1, loan-info l2 WHERE ?))

? == l1.lno = l2.lno AND l1.bname <> l2.bname

FD’s tell us what global constraints to impose....

Page 5: Functional Dependencies An example: loan-info= Observe: tuples with the same value for lno will always have the same value for amt We write: lno  amt

Back to FDsBack to FDsHow to derive them?

(1) Key constraints ( e.g.: bname a key for branch

bname bname

bname bcity

bname assets)

we can write: bname bname bcity assets

Q: Define “superkeys” in terms of FD’s: A: Any set of attributes in a relation that functionally determines all attributes in the relation

Q: Define “candidate key” in terms of FD’s: A: Any superkey such that the removal of any attribute leaves a set that does not functionally determine all attributes.

Page 6: Functional Dependencies An example: loan-info= Observe: tuples with the same value for lno will always have the same value for amt We write: lno  amt

Functional DependenciesFunctional DependenciesHow to derive them?(1) Key constraints(2) Laws of physics.... e.g.: time room course

(3) Trial-and-error... Given R=(A, B,C) try each of the following to see if they make

sense: A B ABC AC ACB BA BCA BC CA CB

What about: AB A ? B B ?Just say:

...plus all of thetrivial dependencies

Page 7: Functional Dependencies An example: loan-info= Observe: tuples with the same value for lno will always have the same value for amt We write: lno  amt

Back to Global ICBack to Global IC’’ss(2) Avoiding the expense Recall: lno bname preserved by:

CREATE ASSERTION lno-bname CHECK ( NOT EXIST (SELECT * FROM loan-info l1, loan-info l2 WHERE l1.lno = l2.lno AND l1.bname <> l2.bname))

Is it necessary to have an assertion for every FD’s?

Ans: Luckily, no. Can preprocess FD set • some FD’s can be eliminated• some FD’s can be combined

Page 8: Functional Dependencies An example: loan-info= Observe: tuples with the same value for lno will always have the same value for amt We write: lno  amt

Functional DependenciesFunctional DependenciesCombining FD’s:

a. cname ccityCREATE ASSERTION name-city CHECK ( NOT EXIST (SELECT * FROM customer c1, customer c2 WHERE c1.cname = c2.cname AND c1.ccity <> c2.ccity))b. cname cstreet

CREATE ASSERTION name-street CHECK ( NOT EXIST (SELECT * FROM customer c1, customer c2 WHERE c1.cname = c2.cname AND c1.cstreet <> c2.cstreet))

combine into: cname ccity cstreetCREATE ASSERTION name-city-street CHECK ( NOT EXIST (SELECT * FROM customer c1, customer c2 WHERE c1.cname = c2.cname AND ??))

?? =((c1.ccity <> c2.ccity) OR (c1.cstreet <> c2.cstreet))

Page 9: Functional Dependencies An example: loan-info= Observe: tuples with the same value for lno will always have the same value for amt We write: lno  amt

Functional DependenciesFunctional DependenciesDetermining unnecessary FD’s:

Consider cname cname

CREATE ASSERTION name-name CHECK ( NOT EXIST (SELECT * FROM customer c1, customer c2 WHERE c1.cname = c2.cname AND c1.cname <> c2.cname))

cannot possibly be violated!

Note: X Y s.t. Y X a “trivial dependency” (true, regradless of attributes involved)

So: Don’t create assertions for trivial dependencies

Page 10: Functional Dependencies An example: loan-info= Observe: tuples with the same value for lno will always have the same value for amt We write: lno  amt

Functional DependenciesFunctional DependenciesDetermining unnecessary FD’s: even non-trivial FD’s can be unnecessary

e.g. a . lno bname CREATE ASSERTION lno-bname CHECK ( NOT EXIST (SELECT * FROM loan-info l1, loan-info l2 WHERE l1.lno = l2.lno AND l1.bname <> l2.bname)) b. bnameassets CREATE ASSERTION lno-bname CHECK ( NOT EXIST (SELECT * FROM loan-info l1, loan-info l2 WHERE l1.bname = l2.bname AND l1.assets <> l2.assets))

Page 11: Functional Dependencies An example: loan-info= Observe: tuples with the same value for lno will always have the same value for amt We write: lno  amt

Cont.Cont.c. lnoassets CREATE ASSERTION lno-bname CHECK ( NOT EXIST (SELECT * FROM loan-info l1, loan-info l2 WHERE l1.lno = l2.lno AND l1.assets <> l2.assets))

But if (a) and (b) succeed, then c must also

Page 12: Functional Dependencies An example: loan-info= Observe: tuples with the same value for lno will always have the same value for amt We write: lno  amt

Functional DependenciesFunctional DependenciesUsing FD’s to determine global IC’s:

Step 1: Given schema R = {A1, ..., An} use key constraints, laws of physics, trial-and-error, etc ... to determine an initial FD set, F.

Step 2: Use FD elimination techniques to generate an alternative (but equivalent) FD set, F’

Step 3: Write assertions for each f in F’ . (for now)Issues: (1) How do we guarantee that F= F’? ans: closures (2) How do we find a “minimal” F’ = F? ans: minimal (canonical) cover algorithm

Page 13: Functional Dependencies An example: loan-info= Observe: tuples with the same value for lno will always have the same value for amt We write: lno  amt

Functional DependenciesFunctional DependenciesExample: suppose R = { A, B, C, D, E, H} and we determine that: F = { A BC, B CE, A E, AC H, D B}

Then we determine the minimal cover of F: Fc = { A BH, B CE, D B}ensuring that F and Fc are equivalent

Note: F requires 5 assertions Fc requires 3 assertions

Page 14: Functional Dependencies An example: loan-info= Observe: tuples with the same value for lno will always have the same value for amt We write: lno  amt

Functional DependenciesFunctional DependenciesEquivalence of FD sets:

FD sets F and G are equivalent if the imply the same set of FD’s

e.g. A B and B C : implies A C

equivalence usually expressed in terms of closures

Closures:

For any FD set, F, F+ is the set of all FD’s implied by F. can calculate in 2 ways: (1) Attribute Closure (2) Armstrong’s axioms

Both techniques tedious-- will do only for toy examples

F equivalent to G iff F+ = G+

Page 15: Functional Dependencies An example: loan-info= Observe: tuples with the same value for lno will always have the same value for amt We write: lno  amt

Attribute ClosuresAttribute ClosuresGiven; R = { A, B, C, D, E, H} and: F = { A BC, B CE, A E, AC H, D B}

What is the closure of CD (CD+) ?

Algorithm att-closure (X: set of Attributes) Result X repeat until stable for each FD in F, Y Z, do if Y Result then Result Result Z

Attribute closure CD

Iteration Result----------------------------------- 0 C D 1 C D B 2 C D B E

Page 16: Functional Dependencies An example: loan-info= Observe: tuples with the same value for lno will always have the same value for amt We write: lno  amt

Attribute ClosuresAttribute ClosuresQ: what is ACD+ ? Ans: ACD+ R

Q: How do you determine if ACD is a superkey? Ans: it is if ACD+ R

Q: How can you determine if ACD is a candidate key? Ans: It is if: ACD+ R AC+ -/-> R AD+ -/-> R not true => AD is a candidate key CD+ -/-> R

Page 17: Functional Dependencies An example: loan-info= Observe: tuples with the same value for lno will always have the same value for amt We write: lno  amt

Attribute Closures to determine Attribute Closures to determine FD closuresFD closures

Given; R = { A, B, C, D, E, H} and: F = { A BC, B CE, A E, AC H, D B}

F+ = { A A+, B B+, C C+, D D+, E E+, H H+, AB AB+, AC AC+, AD AD+, ......}To decide if F,G are equivalent:

(1) Compute F+ (2) Compute G+ (3) Is (1) = (2) ?

Expensive: F+ has 63 rules (in general: 2|R|-1 rules)

Page 18: Functional Dependencies An example: loan-info= Observe: tuples with the same value for lno will always have the same value for amt We write: lno  amt

FD Closures Using ArmstrongFD Closures Using Armstrong’’s s AxiomsAxioms

A. Fundamental Rules (W, X, Y, Z: sets of attributes)

1. Reflexivity

If Y X then X Y

2. Augmentation

If X Y then WX WY

3. Transitivity

If X Y and Y Z then XZ

B. Additional rules (can be proved from A)

4. UNION: If X Y and X Z then X YZ

5. Decomposition: If X YZ then X Y, X Z

6. Pseudotransitivity: If X Y and WY Z then WX Z

Page 19: Functional Dependencies An example: loan-info= Observe: tuples with the same value for lno will always have the same value for amt We write: lno  amt

FD Closures Using ArmstrongFD Closures Using Armstrong’’s s AxiomsAxioms

Given; F = { A BC, (1) B CE, (2) A E, (3) AC H, (4) D B} (5)

Exhaustively apply Armstrong’s axioms to generate F+

F+ = F 1. { A B, A C}: decomposition on (1) 2. { A CE}: transitivity to 1.1 and (2) 3. { B C, B E}: decomp to (2) 4. { A C, A E} decomp to 2 5. { A H} pseudotransitivity to 1.2 and (4)

Page 20: Functional Dependencies An example: loan-info= Observe: tuples with the same value for lno will always have the same value for amt We write: lno  amt

Functional dependenciesFunctional dependencies

Our goal: given a set of FD set, F, find an alternative FD set, G that is: smaller equivalent

Bad news: Testing F=G (F+ = G+) is computationally expensive

Good news: Minimal Cover (or Canonical Cover) algorithm: given a set of FD, F, finds minimal FD set equivalent to F

Minimal: can’t find another equivalent FD set w/ fewer FD’s

Page 21: Functional Dependencies An example: loan-info= Observe: tuples with the same value for lno will always have the same value for amt We write: lno  amt

Minimal Cover AlgorithmMinimal Cover Algorithm

Given: F = { A BC, B CE, A E, AC H, D B}

Determines minimal cover of F:

Fc = { A BH, B CE, D B}

•Fc = F•No G that is equivalent to F and is smaller than Fc

Another example: F = { A BC, B C, A B, AB C, AC D}

MC Algorithm

Fc = { A BD, B C}

Page 22: Functional Dependencies An example: loan-info= Observe: tuples with the same value for lno will always have the same value for amt We write: lno  amt

Minimal Cover AlgorithmMinimal Cover Algorithm

Basic Algorithm

ALGORITHM MinimalCover (X: FD set) BEGIN REPEAT UNTIL STABLE (1) Where possible, apply UNION rule (A’s axioms) (e.g., A BC, ACD becomes ABCD) (2) remove “extraneous attributes” from each FD (e.g., ABC, AB becomes AB, BC i.e., A is extraneous in ABC)

Page 23: Functional Dependencies An example: loan-info= Observe: tuples with the same value for lno will always have the same value for amt We write: lno  amt

Extraneous AttributesExtraneous Attributes(1) Extraneous is RHS? e.g.: can we replace A BC with AC? (i.e. Is B extraneous in A BC?)

(2) Extraneous in LHS ? e.g.: can we replace AB C with A C ? (i.e. Is B extraneous in ABC?)

Simple but expensive test: 1. Replace A BC (or AB C) with A C in F

F2 = F - {A BC} U {A C} or F - {ABC} U {A C} 2. Test if F2+ = F+ ? if yes, then B extraneous

Page 24: Functional Dependencies An example: loan-info= Observe: tuples with the same value for lno will always have the same value for amt We write: lno  amt

Extraneous AttributesExtraneous Attributes

A. RHS: Is B extraneous in A BC?

step 1: F2 = F - {A BC} U {A C} step 2: F+ = F2+ ?

To simplify step 2, observe that F2+ F+

i.e., not new FD’s in F2+)

Why? Have effectively removed AB from F When is F+ = F2+ ?

Ans. When (AB) in F2+

Idea: if F2+ includes: AB and AC, then it includes ABC

Page 25: Functional Dependencies An example: loan-info= Observe: tuples with the same value for lno will always have the same value for amt We write: lno  amt

Extraneous AttributesExtraneous Attributes

B. LHS: Is B extraneous in A BC ?

step 1: F2 = F - {AB C} U {A C} step 2: F+ = F2+ ?

To simplify step 2, observe that F+ F2+

i.e., there may be new FD’s in F2+)

Why? AC “implies” ABC. therefore all FD’s in F+ also in F2+. But ABC does not “imply” AC

When is F+ = F2+ ?

Ans. When (AC) in F+ Idea: if F+ includes: AC then it will include all the FD’s of F+.

Page 26: Functional Dependencies An example: loan-info= Observe: tuples with the same value for lno will always have the same value for amt We write: lno  amt

Extraneous attributesExtraneous attributes

A. RHS : Given F = {ABC, BC} is C extraneous in A BC?

why or why not?

Ans: yes, because AC in { AB, BC}+

Proof. 1. A B 2. B C 3. AC transitivity using Armstrong’s axioms

Page 27: Functional Dependencies An example: loan-info= Observe: tuples with the same value for lno will always have the same value for amt We write: lno  amt

Extraneous attributesExtraneous attributes

B. LHS : Given F = {AB, ABC} is B extraneous in AB C?

why or why not?

Ans: yes, because AC in F+

Proof. 1. A B 2. AB C 3. AC using pseudotransitivity on 1 and 2

Actually, we have AAC but {A, A} = {A}

Page 28: Functional Dependencies An example: loan-info= Observe: tuples with the same value for lno will always have the same value for amt We write: lno  amt

Minimal Cover AlgorithmMinimal Cover Algorithm

ALGORITHM MinimalCover (F: set of FD’s) BEGIN REPEAT UNTIL STABLE (1) Where possible, apply UNION rule (A’s axioms)

(2) Remove all extraneous attributes: a. Test if B extraneous in A BC (B extraneous if (AB) in (F - {ABC} U {AC})+ ) b. Test if B extraneous in ABC (B extraneous in ABC if (AC) in F+)

Page 29: Functional Dependencies An example: loan-info= Observe: tuples with the same value for lno will always have the same value for amt We write: lno  amt

Minimal Cover AlgorithmMinimal Cover AlgorithmExample: determine the minimal cover of F = {A BC, BCE, AE}

Iteration 1: a. F = { ABCE, BCE} b. Must check for up to 5 extraneous attributes

- B extraneous in ABCE? No - C extraneous in A BCE? yes: (AC) in { ABE, BCE} 1. ABE -> 2. AB -> 3. ACE -> 4. A C

- E extraneous in ABE?

Page 30: Functional Dependencies An example: loan-info= Observe: tuples with the same value for lno will always have the same value for amt We write: lno  amt

Minimal Cover AlgorithmMinimal Cover AlgorithmExample: determine the minimal cover of F = {A BC, BCE, AE}

Iteration 1: a. F = { ABCE, BCE} b. Must check for up to 5 extraneous attributes

- B extraneous in ABCE? No - C extraneous in A BCE? Yes - E extraneous in ABE? Yes 1. AB -> 2. ACE -> AE - E extraneous in BCE No - C extraneous in BCE No

Iteration 2: a. F = { A B, B CE} b. Extraneous attributes: - C extraneous in B CE No - E extraneous in B CE No

DONE

Page 31: Functional Dependencies An example: loan-info= Observe: tuples with the same value for lno will always have the same value for amt We write: lno  amt

Minimal Cover AlgorithmMinimal Cover AlgorithmFind the minimal cover of F = { A BC, B CE, A E, AC H, D B}

Ans: Fc= { ABH, B CE, DB}

Page 32: Functional Dependencies An example: loan-info= Observe: tuples with the same value for lno will always have the same value for amt We write: lno  amt

Minimal Cover AlgorithmMinimal Cover Algorithm

Find two different minimal covers of: F = { ABC, B CA, CAB}

Ans: Fc1 = { A B, BC, CA} and

Fc2 = { AC, BA, CB}

Page 33: Functional Dependencies An example: loan-info= Observe: tuples with the same value for lno will always have the same value for amt We write: lno  amt

FD so far...FD so far...1. Minimal Cover algorithm

• result (Fc) guaranteed to be the minimal FD set equivalent to F

2. Closure Algorithms a. Armstrong’s Axioms: more common use: test for extraneous attributes in C.C. algorithm b. Attribute closure: more common use: test for superkeys

3. Purposes a. minimize the cost of global integrity constraints so far: min gic’s = |Fc|

In fact.... Min gic’s = 0 (FD’s for “normalization”)

Page 34: Functional Dependencies An example: loan-info= Observe: tuples with the same value for lno will always have the same value for amt We write: lno  amt

Another use of FDAnother use of FD’’s: Schema s: Schema DesignDesign

Example:

bname bcity assets cname lno amt

Downtown Bkln 9M Jones L-17 1000 Downtown Bkln 9M Johnson L-23 2000 Mianus Horse 1.7M Jones L-93 500 Downtown Bkln 9M Hayes L-17 1000

R =

R: “Universal relation” tuple meaning: Jones has a loan (L-17) for $1000 taken out at the Downtown branch in Bkln which has assets of $9M

Design: + : fast queries (no need for joins!) - : redudancy: update anomalies examples? deletion anomalies

Page 35: Functional Dependencies An example: loan-info= Observe: tuples with the same value for lno will always have the same value for amt We write: lno  amt

DecompositionDecomposition

1. Decomposing the schema R = ( bname, bcity, assets, cname, lno, amt)

R1 = (bname, bcity, assets, cname)R1 = (cname, lno, amt)

2. Decomposing the instance

R = R1 U R2

bname bcity assets cname lno amt

Downtown Bkln 9M Jones L-17 1000 Downtown Bkln 9M Johnson L-23 2000 Mianus Horse 1.7M Jones L-93 500 Downtown Bkln 9M Hayes L-17 1000

bname bcity assets cname

Downtown Bkln 9M Jones Downtown Bkln 9M Johnson Mianus Horse 1.7M Jones Downtown Bkln 9M Hayes

cname lno amt

Jones L-17 1000 Johnson L-23 2000 Jones L-93 500 Hayes L-17 1000

Page 36: Functional Dependencies An example: loan-info= Observe: tuples with the same value for lno will always have the same value for amt We write: lno  amt

Goals of DecompositionGoals of Decomposition1. Lossless Joins Want to be able to reconstruct big (e.g. universal) relation by joining smaller ones (using natural joins) (i.e. R1 R2 = R)

2. Dependency preservation Want to minimize the cost of global integrity constraints based on FD’s ( i.e. avoid big joins in assertions)

3. Redundancy Avoidance Avoid unnecessary data duplication (the motivation for decomposition)

Why important? LJ : information loss DP: efficiency (time) RA: efficiency (space), update anomalies

Page 37: Functional Dependencies An example: loan-info= Observe: tuples with the same value for lno will always have the same value for amt We write: lno  amt

Dependency Goal #1: lossless Dependency Goal #1: lossless joinsjoins

A bad decomposition: bname bcity assets cname

Downtown Bkln 9M Jones Downtown Bkln 9M Johnson Mianus Horse 1.7M Jones Downtown Bkln 9M Hayes

cname lno amt

Jones L-17 1000 Johnson L-23 2000 Jones L-93 500 Hayes L-17 1000

=

bname bcity assets cname lno amt

Downtown Bkln 9M Jones L-17 1000 Downtown Bkln 9M Jones L-93 500 Downtown Bkln 9M Johnson L-23 2000 Mianus Horse 1.7M Jones L-17 1000 Mianus Horse 1.7M Jones L-93 500 Downtown Bkln 9M Hayes L-17 1000

Problem: join adds meaningless tuples “lossy join”: by adding noise, have lost meaningful information as a result of the decomposition

Page 38: Functional Dependencies An example: loan-info= Observe: tuples with the same value for lno will always have the same value for amt We write: lno  amt

Dependency Goal #1: lossless Dependency Goal #1: lossless joinsjoins

Is the following decomposition lossless or lossy?

bname assets cname lno

Downtown 9M Jones L-17 Downtown 9M Johnson L-23 Mianus 1.7M Jones L-93 Downtown 9M Hayes L-17

lno bcity amt

L-17 Bkln 1000 L-23 Bkln 2000 L-93 Horse 500

Ans: Lossless: R = R1 R2, it has 4 tuples

Page 39: Functional Dependencies An example: loan-info= Observe: tuples with the same value for lno will always have the same value for amt We write: lno  amt

Ensuring Lossless JoinsEnsuring Lossless Joins

A decomposition of R : R = R1 U R2 is lossless iff

R1 R2 R1, or

R1 R2 R2

(i.e., intersecting attributes must be a superkey for one of the resulting smaller relations)

Page 40: Functional Dependencies An example: loan-info= Observe: tuples with the same value for lno will always have the same value for amt We write: lno  amt

Decomposition Goal #2: Decomposition Goal #2: Dependency preservationDependency preservation

Goal: efficient integrity checks of FD’s

An example w/ no DP:R = ( bname, bcity, assets, cname, lno, amt) bname bcity assets lno amt bname

Decomposition: R = R1 U R2 R1 = (bname, assets, cname, lno) R2 = (lno, bcity, amt)

Lossless but not DP. Why?

Ans: bname bcity assets crosses 2 tables

Page 41: Functional Dependencies An example: loan-info= Observe: tuples with the same value for lno will always have the same value for amt We write: lno  amt

Decomposition Goal #2: Decomposition Goal #2: Dependency preservationDependency preservation

To ensure best possible efficiency of FD checks ensure that only a SINGLE table is needed in order to check each FD

i.e. ensure that: A1 A2 ... An B1 B2 ... Bm

Can be checked by examining Ri = ( ..., A1, A2, ..., An, ..., B1, ..., Bm, ...)

To test if the decomposition R = R1 U R2 U ... U Rn is DP

(1) see which FD’s of R are covered by R1, R2, ..., Rn

(2) compare the closure of (1) with the closure of FD’s of R

Page 42: Functional Dependencies An example: loan-info= Observe: tuples with the same value for lno will always have the same value for amt We write: lno  amt

Decomposition Goal #2: Decomposition Goal #2: Dependency preservationDependency preservation

Example: Given F = { AB, AB D, C D}

consider R = R1 U R2 s.t. R1 = (A, B, C) , R2 = (C, D) is it DP?

(1) F+ = { ABD, CD}+(2) G+ = {AB, CD} +

(3) F+ = G+ ? No because (AD) not in G+

Decomposition is not DP

Page 43: Functional Dependencies An example: loan-info= Observe: tuples with the same value for lno will always have the same value for amt We write: lno  amt

Decomposition Goal #2: Decomposition Goal #2: Dependency preservationDependency preservation

Example: Given F = { AB, AB D, C D}

consider R = R1 U R2 s.t. R1 = (A, B, D) , R2 = (C, D)

(1) F+ = { ABD, CD}+(2) G+ = {ABD, CD, ...} +

(3) F+ = G+ note: G+ cannot introduce new FDs not in F+

Decomposition is DP

Page 44: Functional Dependencies An example: loan-info= Observe: tuples with the same value for lno will always have the same value for amt We write: lno  amt

Decomposition Goal #3: Redudancy Decomposition Goal #3: Redudancy AvoidanceAvoidance

Redundancy for B=x , y and zExample: A B C

a x 1 e x 1 g y 2 h y 2 m y 2 n z 1 p z 1

(1) An FD that exists in the above relation is: B C

(2) A superkey in the above relation is A, (or any set containing A)

When do you have redundancy? Ans: when there is some FD, XY covered by a relation and X is not a superkey

Page 45: Functional Dependencies An example: loan-info= Observe: tuples with the same value for lno will always have the same value for amt We write: lno  amt

NormalizationNormalization

Decomposition techniques for ensuring:

Lossless joins

Dependency preservation

Redundancy avoidance

We will look at some normal forms:

Boyce-Codd Normal Form (BCNF)

3rd Normal Form (3NF)