6-rel-db-design-06-norm1-slides
6-rel-db-design-06-norm1-slides
Normalization
Functional dependencies
Basic normal forms
First Normal Form (1NF)
Second Normal Form (2NF)
Third Normal Form (3NF)
Finding functional dependencies
Why normalize?
Non-atomic values
Complex code required
Performance impact
Redundancy
Same fact stored multiple times
Storage space wasted
Performance impact
Possibility of conflicting data
Derived facts: special case of redundancy
Redundancy: Misconceptions
FriendName HairColor
Jack Red
Duplicates?
Jane Red
FriendName HairColor
Jack Red
No duplicates!
Jane Red
Non-atomic values
Complex code required
Performance impact
Redundancy
Same fact stored multiple times
Storage space wasted
Performance impact
Possibility of conflicting data
Derived facts: special case of redundancy
Modification anomalies
Design causes modifications to have unwanted side effects
Modification anomalies
Steps
First Normal Form (1NF)
Second Normal Form (2NF)
Third Normal Form (3NF)
Elementary Key Normal Form (EKNF)
Boyce-Codd Normal Form (BCNF)
Fourth Normal Form (4NF)
Fifth Normal Form (5NF)
Domain/Key Normal Form (DKNF)
Sixth Normal Form (6NF)
Normal forms apply to table
Normal form of database = lowest normal form of all its tables
When to normalize?
Most common
Convert Entity Relationship model to relational tables
Normalize relational tables
Disadvantage: Changes must be ported back to ER model
Alternative
Normalize Entity Relationship model
Convert normalized ER model to relational tables
Disadvantage: Normalization is a bit more complicated
Normalize “every object that will eventually become a table”
For IDEF1X:
every entity type
every many-to-many relationship
Functional dependencies
Dave Megan
Can be mutual
Most are not!
Can be mutual
Most are not!
Can be mutual
Most are not!
Can be mutual
Most are not!
Can be mutual
Most are not!
Guaranteed method
Combines finding functional dependencies with normalization
Tedious and time-consuming; use only when needed
Functional dependencies and derived attributes
Sale Tax
TransactionNo A pplies to / Gross Amount
Is s ub ject to Tax Rate
Gross Amount (FK)
Tax Rate (FK) Tax Amount
Tax Amount *
* Tax Amount derives from Gross Amount and Tax Rate
has /
is of
P layer phones
Player name (FK)
Phone number
First Normal Form
Candidate keys
Attribute that can be used to identify individual rows
Combination of attributes that can be used to identify individual rows
Has to be minimal (not containing all attributes of another candidate key)
Sometimes also used for candidate keys not (yet) known to be minimal
Do not choose primary key yet!
(IDEF1X unfortunately forces a –preliminary!- choice)
Finding candidate keys
E xample
A
AB BE DF {B, C} A
A (AK1.1)
B AC {B, C} D
B (AK1.2)
C
C
D AD {B, C} F
D
E AE
E
F
AF
F
Finding candidate keys
E xample
A
AB BE DF {B, C} A
B (AK1.1) AC {B, C} D
C (AK1.2)
D AD {B, C} F
E AE
F
AF
Finding functional dependencies, part 1
Currently checking
Currently checking
Currently checking
Currently checking
Currently checking
Many-to-many relationship
Original candidate key almost always minimal
When not, revisit design
Finding functional dependencies, part 2
? b1 c1 d1 e1 f1 g1 h1 ?
? b1 c1 d1 e1 f1 g1 h1 ?
Finding functional dependencies, part 2
?
Column A Column B Column C Column D Column E Column F Column G Column H Column I
? b1
? c1
? d1
? e1
? f1
? g1
? h1 I1
? b1
? c1
? d1
? e1
? f1
? g1
? h1 i1
Finding functional dependencies, part 2
?
Column A Column B Column C Column D Column E Column F Column G Column H Column I
? b1
? c1 d1
? e1 f1 g1
? h1
? i1
? b1
? c1 d1
? e1 f1 g1
? h1
? i1
Finding functional dependencies, part 2
?
Column A Column B Column C Column D Column E Column F Column G Column H Column I
? b1 c1 d1 e1 f1 g1
? h1 i1
? b1 c1 d1 e1 f1 g1
? h1 i1
Finding functional dependencies, part 2
? b1 c1 d1 e1 f1 g1 h1 ?
? b1 c1 d1 e1 f1 g1 h1 ?
Finding functional dependencies, part 2
Player
Player name
Unfinished!
Date of birth
p lays in / p lays in /
is played by is played by
Co mp e tition Match
League
Date
Player 1 (FK) is played for / League code
Player 2 (FK) P has
League (FK)
Frames won player 1
Frames won player 2
Highest break player 1
Highest break player 2
Frame scores player 1 Our focus
Frame scores player 2
Competition points player 1
Competition points player 2
Demo: verify that attributes are atomic
Co mp e tition Match
League
Date
Player 1 (FK) is played for / League code
Player 2 (FK) P has
League (FK)
Frames won player 1
Frames won player 2
Highest break player 1
Highest break player 2
Frame scores player 1
Frame scores player 2
Competition points player 1
Competition points player 2
Demo: verify that attributes are atomic
League (FK)
Frames won player 1
Frames won player 2
Highest break player 1
Highest break player 2
Frame scores player 1
Frame scores player 2
Competition points player 1
Competition points player 2
Demo: verify that attributes are atomic
Co mp e tition Match
League
Date
Player 1 (FK) is played for / League code
Player 2 (FK) P has
League (FK)
Frames won player 1
Frames won player 2
Highest break player 1
Highest break player 2 '51, 30, 62'
Frame scores player 1
Frame scores player 2
Competition points player 1 '37, 63, 18'
Competition points player 2
Demo: verify that attributes are atomic
Co mp e tition Match
League
Date
Player 1 (FK) is played for / League code
Player 2 (FK) P has
League (FK)
Frames won player 1
Frames won player 2
Highest break player 1
Highest break player 2 51
Frame score 1 player 1 30
Frame score 2 player 1
Frame score 3 player 1 62
Frame score 1 player 2 37
Frame score 2 player 2
Frame score 3 player 3 63
Competition points player 1
18
Competition points player 2
Demo: verify that attributes are atomic
Co mp e tition Match
League
Date
Player 1 (FK) is played for / League code
Player 2 (FK) P has
League (FK)
Frames won player 1
Frames won player 2
Highest break player 1 Co mp e tition Frame
Highest break player 2
Competition points player 1 c ontains / Date (FK)
Competition points player 2 is p art of P Player 1 (FK)
Player 2 (FK)
Frame #
Player 1 score
Player 2 score
Demo: verify that attributes are atomic
Co mp e tition Match
League
Date
Player 1 (FK) is played for / League code
Player 2 (FK) P has
League (FK)
Frames won player 1
Frames won player 2
Highest break player 1 Co mp e tition Frame
Highest break player 2
Competition points player 1 c ontains / Date (FK)
Competition points player 2 is p art of P Player 1 (FK)
Player 2 (FK)
Frame #
Player 1 score
Player 2 score
Demo: verify that candidate keys are minimal Player
Player name
Date of birth
p lays in / p lays in /
is played by is played by
Co mp e tition Match
League
Date
Player 1 (FK) is played for / League code
Player 2 (FK) P has
League (FK)
Frames won player 1
Frames won player 2
Highest break player 1 Co mp e tition Frame
Highest break player 2
Competition points player 1 c ontains / Date (FK)
Competition points player 2 is p art of P Player 1 (FK)
Player 2 (FK)
Frame #
Player 1 score
Player 2 score
Date of birth
p lays in / p lays in /
is played by is played by
Co mp e tition Match
League
Date
Player 1 (FK) is played for / League code
Player 2 (FK) P has
League (FK)
Frames won player 1
Frames won player 2
Highest break player 1 Co mp e tition Frame
Highest break player 2
Competition points player 1 c ontains / Date (FK)
Competition points player 2 is p art of P Player 1 (FK)
Player 2 (FK)
Frame #
Player 1 score
Player 2 score
Date of birth
p lays in / p lays in /
is played by is played by
Co mp e tition Match
League
Date
Player 1 (FK) is played for / League code
Player 2 (FK) P has
League (FK)
Frames won player 1
Frames won player 2
Highest break player 1 Co mp e tition Frame
Highest break player 2
Competition points player 1 c ontains / Date (FK)
Competition points player 2 is p art of P Player 1 (FK)
Player 2 (FK)
Frame #
Player 1 score
Player 2 score
Date Player 1
Player 2 League Frames 1 Frames 2 HB 1 HB 2 Points 1 Points 2
Date of birth
p lays in / p lays in /
is played by is played by
Co mp e tition Match
League
Date
Player 1 (FK) is played for / League code
Player 2 (FK) P has
League (FK)
Frames won player 1
Frames won player 2
Highest break player 1 Co mp e tition Frame
Highest break player 2
Competition points player 1 c ontains / Date (FK)
Competition points player 2 is p art of P Player 1 (FK)
Player 2 (FK)
Frame #
Player 1 score
Player 2 score
Date of birth
p lays in / p lays in /
is played by is played by
Co mp e tition Match
League
Date
Player 1 (FK) is played for / League code
Player 2 (FK) P has
League (FK)
Frames won player 1
Frames won player 2
Highest break player 1 Co mp e tition Frame
Highest break player 2
Competition points player 1 c ontains / Date (FK)
Competition points player 2 is p art of P Player 1 (FK)
Player 2 (FK)
Frame #
Player 1 score
Player 2 score
Date of birth
p lays in / p lays in /
is played by is played by
Co mp e tition Match
League
Date (AK1.1)
Player 1 (FK) is played for / League code
Player 2 (FK) P has
Player 2 (FK) (AK1.2)
League (FK)
Frames won player 1
Frames won player 2
Highest break player 1 Co mp e tition Frame
Highest break player 2
Competition points player 1 c ontains / Date (FK)
Competition points player 2 is p art of P Player 1 (FK)
Frame
Player #
2 (FK)
Frame #
Player 1 score
Player 2
1 score
Player 2 score
Date Player 1 Player 2 League Frames 1 Frames 2 HB 1 HB 2 Points 1 Points 2
2013-02-07
different Katie Jim
? C
? 3? 0? 36
? 12
? 20
? 0?
Demo: verify that candidate keys are minimal Player
Player name
Date of birth
p lays in / p lays in /
is played by is played by
Co mp e tition Match
League
Date (AK1.1)
Player 1 (FK) is played for / League code
P has
Player 2 (FK) (AK1.2)
League (FK)
Frames won player 1
Frames won player 2
Highest break player 1 Co mp e tition Frame
Highest break player 2
Competition points player 1 c ontains / Date (FK)
Competition points player 2 is p art of P Player 1 (FK)
Frame #
Player 1 score
Player 2 score
Date Player 1 Player 2 League Frames 1 Frames 2 HB 1 HB 2 Points 1 Points 2
2012-10-03 different
Dave Mary
Jim
? C
? 3? 0? 36
? 12
? 20
? 0?
Demo: verify that candidate keys are minimal Player
Player name
Date of birth
p lays in / p lays in /
is played by is played by
Co mp e tition Match
League
Date (AK1.1)
Player 1 (FK) is played for / League code
P has
Player 2 (FK) (AK1.2)
League (FK)
Frames won player 1
Frames won player 2
Highest break player 1 Co mp e tition Frame
Highest break player 2
Competition points player 1 c ontains / Date (FK)
Competition points player 2 is p art of P Player 1 (FK)
Frame #
Player 1 score
Player 2 score
Date Player 1 Player 2 League Frames 1 Frames 2 HB 1 HB 2 Points 1 Points 2
2013-02-07
different Katie
? Jim C
? 3? 0? 36
? 12
? 20
? 0?
Demo: verify that candidate keys are minimal Player
Player name
Date of birth
p lays in / p lays in /
is played by is played by
Co mp e tition Match
League
Date (AK1.1)
Player 1 (FK) is played for / League code
P has
Player 2 (FK) (AK1.2)
League (FK)
Frames won player 1
Frames won player 2
Highest break player 1 Co mp e tition Frame
Highest break player 2
Competition points player 1 c ontains / Date (FK)
Competition points player 2 is p art of P Player 1 (FK)
Frame #
Player 1 score
Player 2 score
Date Player 1 Player 2 League Frames 1 Frames 2 HB 1 HB 2 Points 1 Points 2
2012-10-03 Dave
? different
Mary C
? 3? 0? 36
? 12
? 20
? 0?
Demo: verify that candidate keys are minimal Player
Player name
Date of birth
p lays in / p lays in /
is played by is played by
Co mp e tition Match
League
Date (AK1.1)
Player 1 (FK) is played for / League code
P has
Player 2 (FK) (AK1.2)
League (FK)
Frames won player 1
Frames won player 2
Highest break player 1 Co mp e tition Frame
Highest break player 2
Competition points player 1 c ontains / Date (FK)
Competition points player 2 is p art of P Player 1 (FK)
Frame #
Player 1 score
Player 2 score
Date of birth
p lays in / p lays in /
is played by is played by
Co mp e tition Match
League
Date (AK1.1)
Player 1 (FK) is played for / League code
P has
Player 2 (FK) (AK1.2)
League (FK)
Frames won player 1
Frames won player 2
Highest break player 1 Co mp e tition Frame
Highest break player 2
Competition points player 1 c ontains / Date (FK)
Competition points player 2 is p art of P Player 1 (FK)
Frame #
Player 1 score
Player 2 score
Date Player 1 Player 2 League Frames 1 Frames 2 HB 1 HB 2 Points 1 Points 2
Date of birth
p lays in / p lays in /
is played by is played by
Co mp e tition Match
League
Date (AK1.1)
Player 1 (FK) is played for / League code
P has
Player 2 (FK) (AK1.2)
League (FK)
Frames won player 1
Frames won player 2
Highest break player 1 Co mp e tition Frame
Highest break player 2
Competition points player 1 c ontains / Date (FK)
Competition points player 2 is p art of P Player 1 (FK)
Frame #
Player 1 score
Player 2 score
Date of birth
p lays in / p lays in /
is played by is played by
Co mp e tition Match
League
Date (AK1.1)
Player 1 (FK) is played for / League code
P has
Player 2 (FK) (AK1.2)
League (FK)
Frames won player 1
Frames won player 2
Highest break player 1 Co mp e tition Frame
Highest break player 2
Competition points player 1 c ontains / Date (FK)
Competition points player 2 is p art of P Player 1 (FK)
Frame #
Player 1 score
Player 2 score
Date of birth
p lays in / p lays in /
is played by is played by
Co mp e tition Match
League
Date (AK1.1)
Player 1 (FK) is played for / League code
P has
Player 2 (FK) (AK1.2)
League (FK)
Frames won player 1
Frames won player 2
Highest break player 1 Co mp e tition Frame
Highest break player 2
Competition points player 1 c ontains / Date (FK)
Competition points player 2 is p art of P Player 1 (FK)
Frame #
Player 1 score
Player 2 score
Date of birth
p lays in / p lays in /
is played by is played by
Co mp e tition Match
League
Date (AK1.1)
Player 1 (FK) is played for / League code
P has
Player 2 (FK) (AK1.2)
League (FK)
Frames won player 1
Frames won player 2
Highest break player 1 Co mp e tition Frame
Highest break player 2
Competition points player 1 c ontains / Date (FK)
Competition points player 2 is p art of P Player 1 (FK)
Frame #
Player 1 score
Player 2 score
2012-10-03
? Katie
? Jim
? C
? 2? 1? 40
x1 12
? 12
? 10
?
2013-02-15
? Tony
? Jack
? B
? 2? 1? 49
40
x1 37
? 12
? 10
?
Demo: check for missing candidate keys Player
Player name
Date of birth
p lays in / p lays in /
is played by is played by
Co mp e tition Match
League
Date (AK1.1)
Player 1 (FK) is played for / League code
P has
Player 2 (FK) (AK1.2)
League (FK)
Frames won player 1
Frames won player 2
Highest break player 1 Co mp e tition Frame
Highest break player 2
Competition points player 1 c ontains / Date (FK)
Competition points player 2 is p art of P Player 1 (FK)
Frame #
Player 1 score
Player 2 score
Date of birth
p lays in / p lays in /
is played by is played by
Co mp e tition Match
League
Date (AK1.1)
Player 1 (FK) is played for / League code
P has
Player 2 (FK) (AK1.2)
League (FK)
Frames won player 1
Frames won player 2
Highest break player 1 Co mp e tition Frame
Highest break player 2
Competition points player 1 c ontains / Date (FK)
Competition points player 2 is p art of P Player 1 (FK)
Frame #
Player 1 score
Player 2 score
Date of birth
p lays in / p lays in /
is played by is played by
Co mp e tition Match
League
Date (AK1.1)
Player 1 (FK) is played for / League code
P has
Player 2 (FK) (AK1.2)
League (FK)
Frames won player 1
Frames won player 2
Highest break player 1 Co mp e tition Frame
Highest break player 2
Competition points player 1 c ontains / Date (FK)
Competition points player 2 is p art of P Player 1 (FK)
Frame #
Player 1 score
Player 2 score
Date of birth
p lays in / p lays in /
is played by is played by
Co mp e tition Match
League
Date (AK1.1)
Player 1 (FK) is played for / League code
P has
Player 2 (FK) (AK1.2)
League (FK)
Frames won player 1
Frames won player 2
Highest break player 1 Co mp e tition Frame
Highest break player 2
Competition points player 1 c ontains / Date (FK)
Competition points player 2 is p art of P Player 1 (FK)
Frame #
Player 1 score
Player 2 score
Date of birth
p lays in / p lays in /
is played by is played by
Co mp e tition Match
League
Date (AK1.1)
Player 1 (FK) is played for / League code
P has
Player 2 (FK) (AK1.2)
League (FK)
Frames won player 1
Frames won player 2
Highest break player 1 Co mp e tition Frame
Highest break player 2
Competition points player 1 c ontains / Date (FK)
Competition points player 2 is p art of P Player 1 (FK)
Frame #
Player 1 score
Player 2 score
2013-02-15
2012-10-03 Tony Jack B 2 1 40 37 12 10
Demo: check for missing candidate keys Player
Player name
Date of birth
p lays in / p lays in /
is played by is played by
Co mp e tition Match
League
Date (AK1.1)
Player 1 (FK) is played for / League code
P has
Player 2 (FK) (AK1.2)
League (FK)
Frames won player 1
Frames won player 2
Highest break player 1 Co mp e tition Frame
Highest break player 2
Competition points player 1 c ontains / Date (FK)
Competition points player 2 is p art of P Player 1 (FK)
Frame #
Player 1 score
Player 2 score
Date of birth
p lays in / p lays in /
is played by is played by
Co mp e tition Match
League
Date (AK1.1)
Player 1 (FK) is played for / League code
P has
Player 2 (FK) (AK1.2)
League (FK)
Frames won player 1
Frames won player 2
Highest break player 1 Co mp e tition Frame
Highest break player 2
Competition points player 1 c ontains / Date (FK)
Competition points player 2 is p art of P Player 1 (FK)
Frame #
Player 1 score
Player 2 score
Date of birth
p lays in / p lays in /
is played by is played by
Co mp e tition Match
League
Date (AK1.1)
Player 1 (FK) is played for / League code
P has
Player 2 (FK) (AK1.2)
League (FK)
Frames won player 1
Frames won player 2
Highest break player 1 Co mp e tition Frame
Highest break player 2
Competition points player 1 c ontains / Date (FK)
Competition points player 2 is p art of P Player 1 (FK)
Frame #
Player 1 score
Player 2 score
Date of birth
p lays in / p lays in /
is played by is played by
Co mp e tition Match
League
Date (AK1.1)
Player 1 (FK) is played for / League code
P has
Player 2 (FK) (AK1.2)
League (FK)
Frames won player 1
Frames won player 2
Highest break player 1 Co mp e tition Frame
Highest break player 2
Competition points player 1 c ontains / Date (FK)
Competition points player 2 is p art of P Player 1 (FK)
Frame #
Player 1 score
Player 2 score
Date of birth
p lays in / p lays in /
is played by is played by
Co mp e tition Match
League
Date (AK1.1)
Player 1 (FK) is played for / League code
P has
Player 2 (FK) (AK1.2)
League (FK)
Frames won player 1
Frames won player 2
Highest break player 1 Co mp e tition Frame
Highest break player 2
Competition points player 1 c ontains / Date (FK)
Competition points player 2 is p art of P Player 1 (FK)
Frame #
Player 1 score
Player 2 score
Date of birth
p lays in / p lays in /
is played by is played by
Co mp e tition Match
League
Date (AK1.1)
Player 1 (FK) is played for / League code
P has
Player 2 (FK) (AK1.2)
League (FK)
Frames won player 1
Frames won player 2
Highest break player 1 Co mp e tition Frame
Highest break player 2
Competition points player 1 c ontains / Date (FK)
Competition points player 2 is p art of P Player 1 (FK)
Frame #
Player 1 score
Player 2 score
Date of birth
p lays in / p lays in /
is played by is played by
Co mp e tition Match
League
Date (AK1.1)
Player 1 (FK) is played for / League code
P has
Player 2 (FK) (AK1.2)
League (FK)
Frames won player 1
Frames won player 2
Highest break player 1 Co mp e tition Frame
Highest break player 2
Competition points player 1 c ontains / Date (FK)
Competition points player 2 is p art of P Player 1 (FK)
Frame #
Player 1 score
Player 2 score
Date of birth
p lays in / p lays in /
is played by is played by
Co mp e tition Match
League
Date (AK1.1)
Player 1 (FK) is played for / League code
P has
Player 2 (FK) (AK1.2)
League (FK)
Frames won player 1
Frames won player 2
Highest break player 1 Co mp e tition Frame
Highest break player 2
Competition points player 1 c ontains / Date (FK)
Competition points player 2 is p art of P Player 1 (FK)
Frame #
Player 1 score
Player 2 score
p lays in /
• Player 1 League
p lays in /
is played by is played by
Co mp e tition Match
League
Date (AK1.1)
Player 1 (FK) is played for / League code
P has
Player 2 (FK) (AK1.2)
League (FK)
Frames won player 1
Frames won player 2
Highest break player 1 Co mp e tition Frame
Highest break player 2
Competition points player 1 c ontains / Date (FK)
Competition points player 2 is p art of P Player 1 (FK)
Frame #
Player 1 score
Player 2 score
2012-10-03
2013-02-15 Katie
Tony Jack B 2 1 40 37 12 10
Demo: check for missing candidate keys Player
Player name
Functional dependencies found:
Date of birth
p lays in /
• Player 1 League
p lays in /
is played by is played by
Co mp e tition Match
League
Date (AK1.1)
Player 1 (FK) is played for / League code
P has
Player 2 (FK) (AK1.2)
League (FK)
Frames won player 1
Frames won player 2
Highest break player 1 Co mp e tition Frame
Highest break player 2
Competition points player 1 c ontains / Date (FK)
Competition points player 2 is p art of P Player 1 (FK)
Frame #
Player 1 score
Player 2 score
p lays in /
• Player 1 League
p lays in /
is played by is played by
Co mp e tition Match
League
Date (AK1.1)
Player 1 (FK) is played for / League code
P has
Player 2 (FK) (AK1.2)
League (FK)
Frames won player 1
Frames won player 2
Highest break player 1 Co mp e tition Frame
Highest break player 2
Competition points player 1 c ontains / Date (FK)
Competition points player 2 is p art of P Player 1 (FK)
Frame #
Player 1 score
Player 2 score
p lays in /
• Player 1 League
p lays in /
is played by is played by
Co mp e tition Match
League
Date (AK1.1)
Player 1 (FK) is played for / League code
P has
Player 2 (FK) (AK1.2)
League (FK)
Frames won player 1
Frames won player 2
Highest break player 1 Co mp e tition Frame
Highest break player 2
Competition points player 1 c ontains / Date (FK)
Competition points player 2 is p art of P Player 1 (FK)
Frame #
Player 1 score
Player 2 score
p lays in /
• Player 1 League
p lays in /
is played by is played by
Co mp e tition Match
League
Date (AK1.1)
Player 1 (FK) is played for / League code
P has
Player 2 (FK) (AK1.2)
League (FK)
Frames won player 1
Frames won player 2
Highest break player 1 Co mp e tition Frame
Highest break player 2
Competition points player 1 c ontains / Date (FK)
Competition points player 2 is p art of P Player 1 (FK)
Frame #
Player 1 score
Player 2 score
2012-10-03 Katie
Dave Mary
Jim C 2 1 40 12 12 10
Demo: check for missing candidate keys Player
Player name
Functional dependencies found:
Date of birth
p lays in /
• Player 1 League
p lays in /
is played by is played by
Co mp e tition Match
League
Date (AK1.1)
Player 1 (FK) is played for / League code
P has
Player 2 (FK) (AK1.2)
League (FK)
Frames won player 1
Frames won player 2
Highest break player 1 Co mp e tition Frame
Highest break player 2
Competition points player 1 c ontains / Date (FK)
Competition points player 2 is p art of P Player 1 (FK)
Frame #
Player 1 score
Player 2 score
Problems
Redundancy
Modification anomalies
Fixed by normalization
Functional dependencies