You are on page 1of 47

Lecture 7: End of Normal Forms

Outerjoins, Schema Creation and


Views
Wednesday, January 28th, 2004

1
Agenda
• Finish normalization theory (3NF)
• Outerjoins
• Modifying the database (briefly)
• Creating a schema (very briefly)
• Defining views (and cool related stuff).

2
Summary of BCNF
Decomposition
Find a dependency that violates the BCNF condition:
A1 , A2, … An B1, B2, … B m
Heuristics: choose B1 , B2, … Bm“as large as possible”

Decompose:
Continue until
Others A’s B’s there are no
Is there a
BCNF violations
2-attribute
left.
relation that is
not in BCNF ? R1 R2 3
Correct Decompositions
A decomposition is lossless if we can recover:
R(A,B,C)
Decompose

R1(A,B) R2(A,C)

Recover
R’(A,B,C) should be the same as
R(A,B,C)
R’ is in general larger than R. Must ensure R’ = R 4
Correct Decompositions
• Given R(A,B,C) s.t. AB, the
decomposition into R1(A,B), R2(A,C) is
lossless

5
3NF: A Problem with BCNF
Unit Company Product

FD’s: Unit  Company; Company, Product  Unit


So, there is a BCNF violation, and we decompose.
Unit Company
Unit  Company

Unit Product
No FDs

6
So What’s the Problem?
Unit Company Unit Product
Galaga99 UW Galaga99 databases
Bingo UW Bingo databases
No problem so far. All local FD’s are satisfied.
Let’s put all the data back into a single table again:

Unit Company Product

Galaga99 UW databases
Bingo UW databases

Violates the dependency: company, product -> unit! 7


Solution: 3rd Normal Form
(3NF)
A simple condition for removing anomalies from relations:

AArelation
relationRRisisin
in3rd
3rdnormal
normalform
formifif::

Whenever
Whenevertherethereisisaanontrivial
nontrivialdependency ...,AAnn
dependencyAA11,,AA22,,..., BB
for
for RR,,then
then {A
{A11,,AA22,,...,
...,AAnn}}aasuper-key
super-keyfor
forR,
R,
or
orBBisispart
partof
ofaakey.
key.

8
Back to SQL

(For just a little while)

9
Null Values and Outerjoins
Explicit joins in SQL:
Product(name, category)
Purchase(prodName, store)

SELECT
SELECTProduct.name,
Product.name,Purchase.store
Purchase.store
FROM
FROM Product
ProductJOIN
JOINPurchase
PurchaseON
ON
Product.name
Product.name==Purchase.prodName
Purchase.prodName
Same as:

SELECT
SELECTProduct.name,
Product.name,Purchase.store
Purchase.store
FROM
FROM Product,
Product,Purchase
Purchase
WHERE
WHERE Product.name
Product.name==Purchase.prodName
Purchase.prodName
But Products that never sold will be lost !

10
Null Values and Outerjoins
Left outer joins in SQL:
Product(name, category)
Purchase(prodName, store)

SELECT
SELECTProduct.name,
Product.name,Purchase.store
Purchase.store
FROM
FROM Product
ProductLEFT
LEFTOUTER
OUTERJOIN
JOINPurchase
PurchaseON
ON
Product.name
Product.name==Purchase.prodName
Purchase.prodName

11
Product Purchase
Name Category ProdName Store

Gizmo gadget Gizmo Wiz

Camera Photo Camera Ritz

OneClick Photo Camera Wiz

Name Store

Gizmo Wiz

Camera Ritz

Camera Wiz

OneClick NULL 12
Outer Joins

• Left outer join:


– Include the left tuple even if there’s no match
• Right outer join:
– Include the right tuple even if there’s no match
• Full outer join:
– Include the both left and right tuples even if
there’s no match
13
Modifying the Database
Three kinds of modifications
• Insertions
• Deletions
• Updates

Sometimes they are all called “updates”


14
Insertions
General form:

INSERT
INSERT INTO
INTO R(A1,….,
R(A1,….,An)
An) VALUES
VALUES (v1,….,
(v1,….,vn)
vn)

Example: Insert a new purchase to the database:


INSERT
INSERT INTO
INTO Purchase(buyer,
Purchase(buyer,seller,
seller,product,
product,store)
store)
VALUES
VALUES (‘Joe’,
(‘Joe’,‘Fred’,
‘Fred’,‘wakeup-clock-espresso-machine’,
‘wakeup-clock-espresso-machine’,
‘The
‘TheSharper
SharperImage’)
Image’)

Missing attribute  NULL.


May drop attribute names if give them in order. 15
Insertions
INSERT
INSERT INTO
INTO PRODUCT(name)
PRODUCT(name)

SELECT
SELECT DISTINCT
DISTINCT Purchase.product
Purchase.product
FROM
FROM Purchase
Purchase
WHERE
WHERE Purchase.date
Purchase.date>>“10/26/01”
“10/26/01”

The query replaces the VALUES keyword.


Here we insert many tuples into PRODUCT
16
Insertion: an Example
Product(name,
Product(name,listPrice,
listPrice,category)
category)
Purchase(prodName,
Purchase(prodName,buyerName,
buyerName,price)
price)
prodName is foreign key in Product.name

Suppose database got corrupted and we need to fix it:


Purchase
Product
prodName buyerName price
name listPrice category
camera John 200

gizmo 100 gadgets gizmo Smith 80

camera Smith 225

Task: insert in Product all prodNames from Purchase 17


Insertion: an Example
INSERT
INSERT INTO
INTO Product(name)
Product(name)

SELECT
SELECT DISTINCT
DISTINCT prodName
prodName
FROM
FROM Purchase
Purchase
WHERE
WHERE prodName
prodName NOT
NOTININ(SELECT
(SELECT name
nameFROM
FROM Product)
Product)

name listPrice category

gizmo 100 Gadgets

camera - -

18
Insertion: an Example
INSERT
INSERT INTO
INTO Product(name,
Product(name,listPrice)
listPrice)

SELECT
SELECT DISTINCT
DISTINCT prodName,
prodName,price
price
FROM
FROM Purchase
Purchase
WHERE
WHERE prodName
prodName NOT
NOTININ(SELECT
(SELECT name
nameFROM
FROM Product)
Product)

name listPrice category

gizmo 100 Gadgets

camera 200 -

camera ?? 225 ?? - Depends on the implementation


19
Deletions
Example:

DELETE
DELETE FROM
FROM PURCHASE
PURCHASE

WHERE
WHERE seller
seller==‘Joe’
‘Joe’ AND
AND
product
product==‘Brooklyn
‘BrooklynBridge’
Bridge’

Factoid about SQL: there is no way to delete only a single


occurrence of a tuple that appears twice
in a relation.
20
Updates
Example:

UPDATE
UPDATE PRODUCT
PRODUCT
SET
SET price
price==price/2
price/2
WHERE
WHERE Product.name
Product.name ININ
(SELECT
(SELECTproduct
product
FROM
FROM Purchase
Purchase
WHERE
WHERE DateDate=‘Oct,
=‘Oct,25,
25,1999’);
1999’);

21
Data Definition in SQL
So far we have see the Data Manipulation Language, DML
Next: Data Definition Language (DDL)

Data types:
Defines the types.

Data definition: defining the schema.

• Create tables
• Delete tables
• Modify table schema

22
Indexes: to improve performance
Data Types in SQL
• Characters:
– CHAR(20) -- fixed length
– VARCHAR(40) -- variable length
• Numbers:
– INT, REAL plus variations
• Times and dates:
– DATE, DATETIME (SQL Server only)
• To reuse domains:
CREATE DOMAIN address AS
VARCHAR(55)
23
Creating Tables
Example:

CREATE
CREATE TABLE
TABLEPerson(
Person(

name
name VARCHAR(30),
VARCHAR(30),
social-security-number
social-security-number INT,
INT,
age
age SHORTINT,
SHORTINT,
city
city VARCHAR(30),
VARCHAR(30),
gender
gender BIT(1),
BIT(1),
Birthdate
Birthdate DATE
DATE

););
24
Deleting or Modifying a Table
Deleting:
Example: DROP
DROPPerson;
Person; Exercise with care !!

Altering: (adding or removing an attribute).

ALTER
ALTERTABLE
TABLE Person
Person
ADD
ADD phone
phone CHAR(16);
CHAR(16);
Example:
ALTER
ALTER TABLE
TABLE Person
Person
DROP
DROP age;
age;

What happens when you make changes to the schema?


25
Default Values
Specifying default values:

CREATE
CREATE TABLE
TABLEPerson(
Person(
name
name VARCHAR(30),
VARCHAR(30),
social-security-number
social-security-number INT,
INT,
age
age SHORTINT
SHORTINT DEFAULT
DEFAULT100,
100,
city
city VARCHAR(30)
VARCHAR(30)DEFAULT
DEFAULT ‘Seattle’,
‘Seattle’,
gender
gender CHAR(1)
CHAR(1) DEFAULT
DEFAULT ‘?’,
‘?’,
Birthdate
Birthdate DATE
DATE

The default of defaults: NULL 26


Indexes
REALLY important to speed up query processing time.

Suppose we have a relation

Person (name, age, city)

SELECT
SELECT**
FROM
FROM Person
Person
WHERE
WHERE name
name==“Smith”
“Smith”

Sequential scan of the file Person may take long


27
Indexes
• Create an index on name:

Adam Betty Charles …. Smith ….

• B+ trees have fan-out of 100s: max 4 levels !


28
Creating Indexes

Syntax:

CREATE
CREATEINDEX
INDEX nameIndex
nameIndexON
ONPerson(name)
Person(name)

29
Creating Indexes
Indexes can be created on more than one attribute:

CREATE
CREATEINDEX
INDEXdoubleindex
doubleindexONON
Example: Person
Person(age,
(age,city)
city)

SELECT
SELECT**
Helps in: FROM
FROM Person
Person
WHERE
WHEREage
age==55
55AND
ANDcity
city==“Seattle”
“Seattle”
SELECT
SELECT**
But not in: FROM
FROM Person
Person
WHERE
WHEREcity
city==“Seattle”
“Seattle” 30
Creating Indexes

Indexes can be useful in range queries too:

CREATE
CREATEINDEX
INDEXageIndex
ageIndexON
ON Person
Person(age)
(age)

B+ trees help in: SELECT


SELECT**
FROM
FROMPerson
Person
WHERE
WHEREage
age>>25
25AND
ANDage
age<<28
28

Why not create indexes on everything?


31
Defining Views
Views are relations, except that they are not physically stored.

For presenting different information to different users

Employee(ssn, name, department, project, salary)

CREATE
CREATEVIEW
VIEW Developers
DevelopersASAS
SELECT
SELECTname,
name,project
project
FROM
FROM Employee
Employee
WHERE
WHEREdepartment
department==“Development”
“Development”

Payroll has access to Employee, others only to Developers


32
A Different View
Person(name, city)
Purchase(buyer, seller, product, store)
Product(name, maker, category)

CREATE
CREATEVIEW
VIEW Seattle-view
Seattle-view AS
AS

SELECT
SELECT buyer,
buyer,seller,
seller,product,
product,store
store
FROM
FROM Person,
Person,Purchase
Purchase
WHERE
WHERE Person.city
Person.city==“Seattle”
“Seattle” AND
AND
Person.name
Person.name==Purchase.buyer
Purchase.buyer

We have a new virtual table:


Seattle-view(buyer, seller, product, store)
33
A Different View

We can later use the view:

SELECT
SELECT name,
name,store
store
FROM
FROM Seattle-view,
Seattle-view,Product
Product
WHERE
WHERE Seattle-view.product
Seattle-view.product==Product.name
Product.name AND
AND
Product.category
Product.category==“shoes”
“shoes”

34
What Happens When We Query
a View ?
SELECT
SELECT name,
name,Seattle-view.store
Seattle-view.store
FROM
FROM Seattle-view,
Seattle-view,Product
Product
WHERE
WHERE Seattle-view.product
Seattle-view.product==Product.name
Product.name AND
AND
Product.category
Product.category==“shoes”
“shoes”

SELECT
SELECT name,
name,Purchase.store
Purchase.store
FROM
FROM Person,
Person,Purchase,
Purchase,Product
Product
WHERE
WHERE Person.city
Person.city==“Seattle”
“Seattle” AND
AND
Person.name
Person.name==Purchase.buyer
Purchase.buyer AND
AND
Purchase.poduct
Purchase.poduct==Product.name
Product.name AND
AND
Product.category
Product.category==“shoes”
“shoes” 35
Types of Views
• Virtual views:
– Used in databases
– Computed only on-demand – slower at runtime
– Always up to date
• Materialized views
– Used in data warehouses
– Precomputed offline – faster at runtime
– May have stale data

36
Updating Views
How can I insert a tuple into a table that doesn’t exist?

Employee(ssn, name, department, project, salary)

CREATE
CREATEVIEW
VIEW Developers
DevelopersASAS
SELECT
SELECTname,
name,project
project
FROM
FROM Employee
Employee
WHERE
WHEREdepartment
department==“Development”
“Development”

If we make the INSERT


INSERTINTO
INTO Developers
Developers
following insertion: VALUES(“Joe”,
VALUES(“Joe”,“Optimizer”)
“Optimizer”)

It becomes: INSERT
INSERTINTO
INTO Employee
Employee
VALUES(NULL,
VALUES(NULL,“Joe”,
“Joe”,NULL,
NULL,“Optimizer”,
“Optimizer”,NULL)
NULL)

37
Non-Updatable Views
CREATE
CREATEVIEW
VIEW Seattle-view
Seattle-view AS
AS

SELECT
SELECT seller,
seller,product,
product,store
store
FROM
FROM Person,
Person,Purchase
Purchase
WHERE
WHERE Person.city
Person.city==“Seattle”
“Seattle” AND
AND
Person.name
Person.name==Purchase.buyer
Purchase.buyer

How can we add the following tuple to the view?

(“Joe”, “Shoe Model 12345”, “Nine West”)

We need to add “Joe” to Person first, but we don’t have all its attributes
38
Answering Queries Using Views
• What if we want to use a set of views to
answer a query.
• Why?
– The obvious reason…
– Answering queries over web data sources.
• Very cool stuff! (i.e., I did a lot of research
on this).

39
Reusing a Materialized View
• Suppose I have only the result of SeattleView:
SELECT buyer, seller, product, store
FROM Person, Purchase
WHERE Person.city = ‘Seattle’ AND
Person.per-name = Purchase.buyer
• and I want to answer the query
SELECT buyer, seller
FROM Person, Purchase
WHERE Person.city = ‘Seattle’ AND
Person.per-name = Purchase.buyer AND
Purchase.product=‘gizmo’.
Then, I can rewrite the query using the view.
40
Query Rewriting Using Views
Rewritten query:
SELECT buyer, seller
FROM SeattleView
WHERE product= ‘gizmo’

Original query:
SELECT buyer, seller
FROM Person, Purchase
WHERE Person.city = ‘Seattle’ AND
Person.per-name = Purchase.buyer AND
Purchase.product=‘gizmo’.

41
Another Example
• I still have only the result of SeattleView:
SELECT buyer, seller, product, store
FROM Person, Purchase
WHERE Person.city = ‘Seattle’ AND
Person.per-name = Purchase.buyer
• but I want to answer the query
SELECT buyer, seller
FROM Person, Purchase
WHERE Person.city = ‘Seattle’ AND
Person.per-name = Purchase.buyer AND
Person.Phone LIKE ‘206 543 %’.

42
And Now?
• I still have only the result of SeattleView:
SELECT buyer, seller, product, store
FROM Person, Purchase, Product
WHERE Person.city = ‘Seattle’ AND
Person.per-name = Purchase.buyer AND
Purchase.product = Product.name
• but I want to answer the query
SELECT buyer, seller
FROM Person, Purchase
WHERE Person.city = ‘Seattle’ AND
Person.per-name = Purchase.buyer.

43
And Now?
• I still have only the result of:
SELECT seller, buyer, Sum(Price)
FROM Purchase
WHERE Purchase.store = ‘The Bon’
Group By seller, buyer
• but I want to answer the query
SELECT seller, Sum(Price)
FROM Purchase
WHERE Person.store = ‘The Bon’
Group By seller

And what if it’s the other way around?

44
Finally…
• I still have only the result of:
SELECT seller, buyer, Count(*)
FROM Purchase
WHERE Purchase.store = ‘The Bon’
Group By seller, buyer
• but I want to answer the query
SELECT seller, Count(*)
FROM Purchase
WHERE Person.store = ‘The Bon’
Group By seller

45
The General Problem
• Given a set of views V1,…,Vn, and a query
Q, can we answer Q using only the answers to
V1,…,Vn?
• Why do we care?
– We can answer queries more efficiently.
– We can query data sources on the WWW in a
principled manner.
• Many, many papers on this problem.
• The best performing algorithm: The MiniCon
Algorithm, (Pottinger & (Ha)Levy, 2000). 46
Querying the WWW
• Assume a virtual schema of the WWW, e.g.,
– Course(number, university, title, prof, quarter)
• Every data source on the web contains the answer
to a view over the virtual schema:
UW database: SELECT number, title, prof
FROM Course
WHERE univ=‘UW’ AND quarter=‘2/02’
Stanford database: SELECT number, title, prof, quarter
FROM Course
WHERE univ=‘Stanford’
User query: find all professors who teach “database systems”

47

You might also like