Bài 7: Chuẩn hoá dữ liệu,
Một số vấn đề khác
1
EE4509, EE4253, EE6133 – HK1 2013/2014
TS. Đào Trung Kiên – ĐH Bách khoa Hà Nội
Chuẩn hoá dữ liệu
(data normalization)
2
EE4509, EE4253, EE6133 – HK1 2013/2014
TS. Đào Trung Kiên – ĐH Bách khoa Hà Nội
Khái niệm
Việc thiết kế một CSDL quan hệ là xây dựng một
lược đồ quan hệ
cho phép lưu trữ những dữ liệu mong muốn
giảm thiểu tính dư thừa dữ liệu
cho phép trích xuất thông tin dễ dàng
sử dụng các dạng chuẩn (normal forms): là tập hợp
các tiêu chuẩn cho CSDL
Chuẩn hoá dữ liệu là quá trình cấu trúc một CSDL
quan hệ nhằm giảm thiểu dư thừa và phụ thuộc của
dữ liệu (dựa vào khoá và các phụ thuộc dạng hàm)
3
EE4509, EE4253, EE6133 – HK1 2013/2014
TS. Đào Trung Kiên – ĐH Bách khoa Hà Nội
Các dạng chuẩn
Dạng chuẩn thứ nhất (First normal form – 1NF): 1970
Dạng chuẩn thứ hai (Second normal form – 2NF): 1971
Dạng chuẩn thứ ba (Third normal form – 3NF): 1971
Dạng chuẩn Boyce-Codd (Boyce-Codd normal form –
BCNF): 1974
Dạng chuẩn thứ tư (Forth normal form – 4NF): 1977
Dạng chuẩn thứ năm (Fifth normal form – 5NF): 1979
Dạng chuẩn thứ sáu (Sixth normal form – 6NF): 2003
4
EE4509, EE4253, EE6133 – HK1 2013/2014
TS. Đào Trung Kiên – ĐH Bách khoa Hà Nội
Dạng chuẩn thứ nhất – 1NF
Một thực thể thoả mãn 1NF nếu nó không
có nhóm thuộc tính nào được lặp lại
Loại bỏ các thuộc tính đa trị
Phản VD: thực thể Order vi phạm 1NF vì
nhóm (item_name, item_number, item_price)
lặp lại 9 lần
Đây là dạng chuẩn đơn giản nhất
Chuyển về 1NF:
Chia các nhóm thuộc tính lặp lại thành các
quan hệ nhỏ hơn
Sử dụng thuộc tính khoá và khoá ngoài
Liên kết 1 n giữa các quan hệ
5
EE4509, EE4253, EE6133 – HK1 2013/2014
TS. Đào Trung Kiên – ĐH Bách khoa Hà Nội
Order
id: int
shipdate: date
customer: string
address: string
item_name1: string
item_number1: int
item_price1: int
item_name2: string
item_number2: int
item_price2: int
item_name9: string
item_number9: int
item_price9: int
Ví dụ: Chuyển một thực thể về 1NF
Định nghĩa thêm quan hệ phụ: OrderItem
Liên kết 1 n
Chú ý sử dụng thêm khoá ngoài: order_id
6
EE4509, EE4253, EE6133 – HK1 2013/2014
TS. Đào Trung Kiên – ĐH Bách khoa Hà Nội
Order
id: int
shipdate: date
customer: string
address: string
item_name: string
item_number: int
item_price: int
OrderItem
order_id: int
Dạng chuẩn thứ hai – 2NF
Một quan hệ thoả mãn 2NF khi và chỉ khi đồng thời:
thoả mãn 1NF
không có thuộc tính nào được xác định bởi một tập con
của khoá
7
EE4509, EE4253, EE6133 – HK1 2013/2014
TS. Đào Trung Kiên – ĐH Bách khoa Hà Nội
mã
-
sv
lớp họ-tên
123
CSDL
Trần
Khánh Linh
123
KTLT
Trần
Khánh Linh
456
LTM
Bill Gates
456
CSDL
Bill Gates
456
KTLT
Bill Gates
789
VXL
Lý
Liên Kiệt
789
LTM
Lý
Liên Kiệt
Phản VD: quan hệ bên không
thoả mãn 2NF vì:
họ-tên được xác định hoàn
toàn bởi mã-sv
mã-sv là tập con của khoá
(mã-sv, lớp)
Tính dư thừa dữ liệu: họ tên
được lưu trữ nhiều lần
Chuyển về 2NF
Để chuyển một quan hệ về 2NF:
Tách thành các quan hệ nhỏ hơn
Sử dụng liên kết 1 n
8
EE4509, EE4253, EE6133 – HK1 2013/2014
TS. Đào Trung Kiên – ĐH Bách khoa Hà Nội
Mã
SV
Họ tên
123
Trần
Khánh Linh
456
Bill Gates
789
Lý
Liên Kiệt
Mã
SV
Lớp
123
CSDL
123
KTLT
456
LTM
456
CSDL
456
KTLT
789
VXL
789
LTM
Phụ thuộc dạng hàm
2NF sử dụng khái niệm phụ thuộc dạng hàm
(functional dependencies): là sự tổng quát hoá của
khái niệm khoá
Định nghĩa: Trên một quan hệ R, cho α ⊆ R và β ⊆ R
là hai tập thuộc tính của R. Gọi β phụ thuộc dạng
hàm vào α (ký hiệu: α → β) khi và chỉ khi mỗi giá trị
của α xác định một giá trị của β.
Với ví dụ trước ta có:
mã-sv → họ-tên
Với khái niệm này, có thể định nghĩa lại 2NF: không
có tập thuộc tính không khoá nào phụ thuộc dạng
hàm vào một tập con của thuộc tính khoá
9
EE4509, EE4253, EE6133 – HK1 2013/2014
TS. Đào Trung Kiên – ĐH Bách khoa Hà Nội
Các tính chất của phụ thuộc dạng hàm
Các tiên đề Armstrong
Phản xạ (phụ thuộc tầm thường): nếu β ⊆ α thì α → β
Tăng cường: nếu α → β thì (α, μ) → (β, μ)
Bắc cầu: nếu α → β và β → μ thì α → μ
Một số tính chất khác
Hợp: nếu α → β và α → μ thì α → (β, μ)
Phân rã: nếu α → (β, μ) và α → β thì α → μ
Giả bắc cầu: nếu α → β và (β, μ) → λ thì (α, μ) → λ
10
EE4509, EE4253, EE6133 – HK1 2013/2014
TS. Đào Trung Kiên – ĐH Bách khoa Hà Nội
Dạng chuẩn thứ ba – 3NF
Một quan hệ thoả mãn 3NF khi và chỉ khi đồng thời:
thoả mãn 2NF
không có phụ thuộc dạng hàm nào với thuộc tính không
khoá
Phản ví dụ:
(Tồn tại phụ thuộc dạng hàm: tác-giả → năm-sinh-tg)
11
EE4509, EE4253, EE6133 – HK1 2013/2014
TS. Đào Trung Kiên – ĐH Bách khoa Hà Nội
tên sách năm tác-giả năm-sinh-tg
The universe in a nutshell
2001
Stephen Hawking
1942
The Da Vinci code
2003
Dan Brown
1964
A brief history of time
1988
Stephen Hawking
1942
Digital fortress
1998
Dan Brown
1964
The
lost symbol 2009
Dan Brown
1964
Chuyển về 3NF
Để chuyển một quan hệ về 3NF (tương tự với 2NF):
Tách thành các quan hệ nhỏ hơn
Sử dụng liên kết 1 n
Thêm thuộc tính khoá của quan hệ mới
12
EE4509, EE4253, EE6133 – HK1 2013/2014
TS. Đào Trung Kiên – ĐH Bách khoa Hà Nội
tên sách năm
tác-giả
The universe in a nutshell
2001
Stephen Hawking
The Da Vinci code
2003
Dan Brown
A brief history of time
1988
Stephen Hawking
Digital fortress
1998
Dan Brown
The
lost symbol 2009
Dan Brown
tác-giả
năm
-sinh-
tg
Stephen Hawking
1942
Dan Brown
1964
Dạng chuẩn Boyce-Codd – BCNF
BCNF được định nghĩa để bổ trợ cho 3NF còn
được gọi là 3.5NF
Định nghĩa: quan hệ R thoả mãn BCNF khi và chỉ
khi: với mỗi phụ thuộc dạng hàm α → β, một trong
hai điều kiện sau thoả mãn:
α → β là phụ thuộc dạng hàm tầm thường (tức β ⊆ α)
α là khoá của R
Tính chất:
Nếu R thoả mãn BCNF thì thoả mãn 3NF
Ngược lại chưa chắc đúng, nhưng chỉ một số ít trường
hợp
13
EE4509, EE4253, EE6133 – HK1 2013/2014
TS. Đào Trung Kiên – ĐH Bách khoa Hà Nội
Khung nhìn
(views)
14
EE4509, EE4253, EE6133 – HK1 2013/2014
TS. Đào Trung Kiên – ĐH Bách khoa Hà Nội
Khái niệm
Khung nhìn là các quan hệ ảo thuần tuý về mặt
logic, được tạo ra dựa trên các quan hệ thực, nhằm
giúp thuận tiện trong sử dụng
Ví dụ:
Trên CSDL nhân viên, ẩn thông tin về mức lương, địa chỉ
nhà với các người dùng thông thường
Trên CSDL sinh viên, gộp các quan hệ SinhVien, LopHoc,
DangKy thành một quan hệ ảo khác để dễ sử dụng
Việc sửa đổi hay trích thông tin trên khung nhìn phải
đảm bảo phản ánh đúng như khi thao tác trên các
quan hệ thực
15
EE4509, EE4253, EE6133 – HK1 2013/2014
TS. Đào Trung Kiên – ĐH Bách khoa Hà Nội
Lý do chính dùng khung nhìn
Chỉ làm việc trên một phần của dữ liệu
Có thể gộp nhiều quan hệ thành một quan hệ ảo
Tạo ra các quan hệ có khả năng tuỳ biến cao theo nhu
cầu sử dụng
16
EE4509, EE4253, EE6133 – HK1 2013/2014
TS. Đào Trung Kiên – ĐH Bách khoa Hà Nội
Khung nhìn không lưu trữ
thêm dữ liệu, mà thực thi
trên các quan hệ thực
Hỗ trợ thêm khả năng bảo
mật thông tin
Ẩn những phần dữ liệu
không muốn thể hiện ra
bên ngoài
SQL
Tạo khung nhìn:
create view tên as select …;
Định nghĩa của khung nhìn phụ thuộc vào câu lệnh
select
Xoá khung nhìn:
drop view tên;
Sau khi được tạo, việc truy vấn và cập nhật dữ liệu
của khung nhìn tương tự như với các quan hệ
thường
17
EE4509, EE4253, EE6133 – HK1 2013/2014
TS. Đào Trung Kiên – ĐH Bách khoa Hà Nội
Ví dụ (MySQL)
mysql> select * from t;
+ + +
| qty | price |
+ + +
| 3 | 50 |
| 5 | 60 |
| 2 | 20 |
+ + +
3 rows in set (0.00 sec)
mysql> create view t1 as select qty, price as value from t where qty>2;
Query OK, 0 rows affected (0.02 sec)
mysql> select * from t1;
+ + +
| qty | value |
+ + +
| 3 | 50 |
| 5 | 60 |
+ + +
2 rows in set (0.01 sec)
mysql> _
18
EE4509, EE4253, EE6133 – HK1 2013/2014
TS. Đào Trung Kiên – ĐH Bách khoa Hà Nội
Đánh chỉ mục
(indexing)
19
EE4509, EE4253, EE6133 – HK1 2013/2014
TS. Đào Trung Kiên – ĐH Bách khoa Hà Nội
Khái niệm
Việc tìm kiếm với dữ liệu có sắp xếp sẽ nhanh hơn
nhiều so với dữ liệu không được sắp xếp
Ví dụ: bài toán tra từ điển
Đánh chỉ mục (indexing) là việc tạo ra các cấu trúc
dữ liệu (cây, bảng băm,…) phụ để giúp tìm kiếm dữ
liệu nhanh hơn
Có thể tạo nhiều index cho mỗi quan hệ
Nên tạo index cho các thuộc tính hay được dùng trong
các điều kiện tìm kiếm (mệnh đề where )
Không phải điều kiện tìm kiếm nào cũng có thể dùng
được index (VD: tìm kiếm chuỗi con,…)
20
EE4509, EE4253, EE6133 – HK1 2013/2014
TS. Đào Trung Kiên – ĐH Bách khoa Hà Nội
SQL
Tạo index:
create index tên-index
on tên -quan-hệ(tên-thuộc-tính );
Xoá index:
drop index tên-index on tên-quan-hệ;
Liệt kê các index:
(MySQL) show indexes from tên-quan-hệ;
(SQL Server) exec sp_helpindex tên-quan-hệ;
Sau khi index được tạo, việc sử dụng các quan hệ
vẫn như trước. Việc sử dụng tới các index là tự
động do DBMS tự quyết định.
21
EE4509, EE4253, EE6133 – HK1 2013/2014
TS. Đào Trung Kiên – ĐH Bách khoa Hà Nội
Ví dụ (MySQL)
mysql> select count(*) from thivien_poem where AUTHOR=20;
+ +
| count(*) |
+ +
| 158 |
+ +
1 row in set (1.74 sec)
mysql> create index thivien_poem_AUTHOR on thivien_poem(AUTHOR);
Query OK, 40349 rows affected (1 min 14.00 sec)
Records: 40349 Duplicates: 0 Warnings: 0
mysql> select count(*) from thivien_poem where AUTHOR=20;
+ +
| count(*) |
+ +
| 158 |
+ +
1 row in set (0.00 sec)
mysql> _
22
EE4509, EE4253, EE6133 – HK1 2013/2014
TS. Đào Trung Kiên – ĐH Bách khoa Hà Nội
Bài tập
1. Xác định xem quan hệ sau thuộc dạng chuẩn nào:
ITEM (SKU, PromID, Vendor, Style, Price)
(SKU, PromID) → (Vendor, Style, Price)
SKU → (Vendor, Style)
2. Chuẩn hoá quan hệ trên về dạng cao hơn
3. Chọn một khoá và liệt kê các phụ thuộc dạng hàm cho:
ITEMS (PONum, ItemNum, PartNum, Desc, Price, Qty)
23
EE4509, EE4253, EE6133 – HK1 2013/2014
TS. Đào Trung Kiên – ĐH Bách khoa Hà Nội