Khi đề cập đến khái niệm cơ sở dữ liệu, chắc hẳn ta phải nhắc đến dữ liệu. Vậy dữ liệu là gì? Nói đơn giản, dữ liệu (data) là những sự kiện có thể ghi chép lại và có ý nghĩa. Trên thực tế, ngoài dữ liệu, ta còn có khái niệm siêu dữ liệu (metadata), đó là dữ liệu miêu tả dữ liệu. Nói đơn giản, một siêu dữ liệu là bể chứa thông tin dữ liệu. Vậy thì cơ sở dữ liệu là gì? Nói đơn giản, nó là tập hợp các dữ liệu có liên quan đến nhau, được lưu trữ trên máy tính, có nhiều người sử dụng, và được tổ chức theo một mô hình nào đó.
Trang 1TẢN MẠN VỀ CSDL – PHẦN 1
Khi đề cập đến khái niệm cơ sở dữ liệu, chắc hẳn ta phải nhắc đến dữ liệu Vậy dữ liệu là gì? Nói đơn
giản, dữ liệu (data) là những sự kiện có thể ghi chép lại và có ý nghĩa Trên thực tế, ngoài dữ liệu, ta còn
có khái niệm siêu dữ liệu (metadata), đó là dữ liệu miêu tả dữ liệu Nói đơn giản, một siêu dữ liệu là bể
chứa thông tin dữ liệu.
Vậy thì cơ sở dữ liệu là gì? Nói đơn giản, nó là tập hợp các dữ liệu có liên quan đến nhau, được lưu trữ trên máy tính, có nhiều người sử dụng, và được tổ chức theo một mô hình nào đó
Khi nhắc đến cơ sở dữ liệu, ta cũng cần đề cập đến hệ quản trị cơ sở dữ liệu Hê quản trị csdl là tập hợp chương trình giúp cho người sử dụng tạo ra, khai thác và duy trì csdl
CSDL có 4 tính chất chủ yếu, có thể viết tắt là ACID, 4 tính chất là:
• Tính nguyên tố (Atomicity): một transaction có nhiều thao tác khác biệt thì hoặc là toàn bộ các
thao tác, hoặc là không thao tác nào được hoàn thành
• Tính nhất quán (Consistency): một transaction hoặc là tạo ra một trạng thái mới và hợp lệ cho tất cả dữ liệu, hoặc là quay về trạng thái trước khi transaction bắt đầu Có 3 dạng:
1 Nhất quán mạnh (strong consistency): sau khi cập nhật được diễn ra, các lần đọc sau đó
sẽ trả về giá trị vừa được cập nhật
Trang 22 Nhất quán yếu (weak consistency): hệ thống sẽ không đảm bảo các lần đọc tiếp theo có
trả về giá trị mới nhất hay không Để giá trị mới nhất được trả về, cần phải thỏa một số điều kiện nhất định
3 Nhất quán cuối cùng (eventual consistency): đây là một dạng đặc biệt của tính nhất
quán yếu Hệ thống đảm bảo rằng, về cuối cùng, nếu không còn cập nhật nào nữa thì tất
cả truy nhập sẽ trả về giá trị cập nhật cuối cùng
• Tính độc lập (Isolation): một transaction đang được thực thi và chưa được commit thì phải đảm bảo độc lập (isolate) với các hệ thống khác
• Tính bền vững (Durability): dữ liệu được hệ thống lưu lại ngay cả khi nó bị hư hoặc có lỗi hệ
thống
SQL – Structured Query Language, là ngôn ngữ truy vấn có cấu trúc Nó được thiết kế để quản lý dữ liệu
trong hệ quản trị csdl DBMS Bản thân SQL không phải là hệ quản trị csdl, và do đó nó không thể tồn tại
độc lập SQL là một phần của hệ quản trị csdl, nó đóng vai trò là ngôn ngữ và là công cụ giao tiếp giữa
user và hệ quản trị csdl
Một database sẽ có 2 loại file: tập tin dữ liệu (data file) và tập tin lưu vết (log file)
• Tập tin dữ liệu (data file): bao gồm tập tin sơ cấp (primary data file) và tập tin thứ cấp
(secondary data file)
1 Tập tin sơ cấp (primary data file): chứa thông tin hệ thống và chứa con trỏ (pointer) trỏ
đến tập tin thứ cấp
2 Tập tin thứ cấp (secondary data file): chứa các đối tượng dữ liệu và user data Có thể lưu
trữ ở nơi khác so với tập tin sơ cấp
• Tập tin lưu vết (log file): lưu thông tin về các transaction, dùng cho việc thiết kế hệ thống và phục hồi (restore) dữ liệu
Đã có SQL thì chắc hẳn sẽ có NoSQL Vậy NoSQL là gì? NoSQL – Not Relational SQL, đây là thuật ngữ dùng chung cho các hệ csdl không quan hệ NoSQL chủ yếu hướng đến mô hình lưu trữ key-value và hệ
thống lưu trữ phân tán
Trang 3Mặc dù NoSQL bỏ qua tính nhất quán (consistent) của dữ liệu, nhưng về cuối cùng, nó lại thỏa mãn tính nhất quán cuối cùng (eventual consistency).
Trang 4TẢN MẠN VỀ CSDL – PHẦN 2
Hôm nay, tôi xin đề cập đến các dạng chuẩn hóa trong csdl Chuẩn hóa (normalization) là quá trình phân
rã (decompose) một bảng thành các bảng (table) nhỏ hơn dựa vào các phụ thuộc hàm (functional
dependency).
Mục đích của chuẩn hóa (normalization) là loại bỏ (eliminate) các dư thừa dữ liệu (data redundancy), các lỗi khi thao tác dư thừa và các lỗi khi thao tác dữ liệu Tuy nhiên, việc chuẩn hóa (normalization) lại làm tăng thời gian truy vấn (query).
Chuẩn hóa (normalization) được dùng chủ yếu cho 2 mục đích chính:
• Loại bỏ dữ liệu thừa, hoặc dữ liệu không hữu ích
• Đảm bảo dữ liệu phụ thuộc có nghĩa
Có 4 dạng chuẩn thường gặp, đó là: chuẩn 1 (1NF), chuẩn 2 (2NF), chuẩn 3 (3NF) và chuẩn BCNF.
Một bảng (table) thỏa mãn chuẩn 1NF nếu và chỉ nếu toàn bộ các miền giá trị của các cột đều chỉ chứa
giá trị nguyên tố
Bảng sau đây không thỏa 1NF
Sau khi điều chỉnh, bảng sau thỏa 1NF
Trang 5Một quan hệ ở dạng chuẩn 2NF nếu quan hệ đó là:
• 1NF
• Các thuộc tính không khóa phải phụ thuộc hàm (functional dependency) đầy đủ vào khóa chính (primary key).
Bảng sau không thỏa 2NF
Bảng sau thỏa 2NF
Trang 6Một quan hệ thỏa chuẩn 3NF khi:
• Thỏa 2NF
• Các thuộc tính không khóa phải phụ thuộc trực tiếp vào khóa chính (không có phụ thuộc bắc cầu)
Bảng sau không đạt chuẩn 3NF
Nguyên do là cột (column) Street, city và State phụ thuộc vào Zip, trong khi Zip phụ thuộc vào khóa chính
là Student_id phụ thuộc bắc cầu không thỏa 3NF
Bảng sau đạt chuẩn 3NF
Dạng chuẩn BCNF là dạng chuẩn thỏa:
• 3NF
• Không có thuộc tính khóa mà phụ thuộc hàm vào thuộc tính không khóa
Trang 8TẢN MẠN VỀ CSDL – PHẦN 3
Nội dung bài hôm nay, tôi xin đề cập đến chỉ mục (index) và khung nhìn (view) trong csdl Chỉ mục (index) là bảng tra cứu đặc biệt, dùng để tăng nhanh tốc độ (speed up) tra cứu và hiệu suất lấy dữ liệu Nói đơn giản, một chỉ mục (index) là một con trỏ (pointer) trỏ đến dữ liệu trong một bảng (table), nó tương tự như chỉ mục trong mục lục (outline) của cuốn sách.
Một chỉ mục (index) giúp tăng tốc độ các câu truy vấn select và các mệnh đề Where, nhưng lại làm chậm việc dữ liệu nhập vào thông qua insert và update, đồng thời cũng chiếm dụng bộ nhớ khá nhiều Các chỉ mục (index) có thể được tạo hoặc xóa mà không ảnh hưởng đến dữ liệu.
Có 2 loại chỉ mục (index), đó là clustered index và non – clustered index :
• Clustered index: được tạo ra khi bảng có khóa chính Các dữ liệu được sắp xếp theo thư mục cây
dựa vào bảng chữ cái Trong 1 bảng chỉ có 1 clustered index
• non – clustered index: không sắp xếp thứ tự dữ liệu theo trật tự nào cả, nhưng vẫn nằm trong 1
số logic do index quy định Trong 1 bảng có thể có nhiều non-clustered index
Để tạo chỉ mục, ta sử dụng lệnh:
Để tạo chỉ mục cho cột đơn (single column), ta dùng lệnh
Để đảm bảo toàn vẹn dữ liệu, ta sử dụng unique index, unique index không cho phép bất kì bản sao nào
được chèn vào bảng
Để tạo composite index, ta dùng câu lệnh
Việc chọn composite index hay single column là tùy thuộc vào mục đích và nhu cầu sử dụng Nếu có nhiều hơn 2 cột được sử dụng thường xuyên thì chọn composite index sẽ tốt hơn.
Trang 9Khung nhìn(view) thực chất giống một bảng ảo (virtual table), cho phép người dùng thực hiện:
• Dữ liệu có cấu trúc (structure data) theo cách mà người dùng hoặc lớp người dùng tìm thấy tính
tự nhiên hoặc tính trực quan
• Giới hạn (restrict) truy cập vào dữ liệu để người dùng có thể thấy và sửa đổi chính xác những gì
họ cần
• Tạo ra các bảng báo cáo (report) bằng cách tổng kết dữ liệu từ nhiều bảng
Về mặt logic, khung nhìn (view) được coi như 1 bảng bình thường, tức là ta có thể truy vấn (query), thay đổi dữ liệu, tạo chỉ mục(index) trên nó
Về mặt vật lý, khung nhìn (view) đơn thuần chỉ là bảng ảo (virtual table), và không chứa dữ liệu, nó đơn thuần chỉ là phản ánh dữ liệu (snapshot) hiện thời của bảng cơ sở
Vậy khi nào thì dùng khung nhìn(view)? Ta sẽ dùng khung nhìn(view) trong các trường hợp sau:
• Khi không muốn người dùng biết tên bảng, cấu trúc thật của bảng
• Khi có câu truy vấn phức tạp, mà có thể ta phải sử dụng nhiều lần Tạo view sẽ lưu lại câu truy
vấn
• Khi chỉ muốn người dùng truy cập giới hạn đến một số cột hoặc dòng nhất định
Để tạo view, ta sử dụng câu truy vấn sau:
Sử dụng with check option để đảm bảo rằng các lênh update và insert thỏa mãn các điều kiện trong
view
Để view có thể cập nhật, một số quy định sau phải có:
• Select không có distinct hoặc top
• Select không bao gồm 1 hàm tổng hợp
• Select không phải là giá trị được tính toán
• Select không bao gồm having và group by
• View không thể bao gồm toán tử union
Trang 10Một view không thể được cập nhật, ta gọi view đó chỉ đọc (read-only)
Trang 11TẢN MẠN VỀ SQL – PHẦN 4
Hôm nay, chúng ta sẽ cùng thảo luận về một vấn đề khá hữu ích, đó là khóa chính (primary key) trong csdl Khóa chính (primary key) là định danh (identity) duy nhất cho mỗi bản ghi (record) trong bảng Với các cột (column) được chọn làm khóa chính (primary key) phải thỏa mãn 2 điều kiện:
• Không null
• Là duy nhất (unique) trong bảng
Khóa chính (primary key) được chia làm 2 loại: khóa tự nhiên (natural key) và khóa đại diện (surrogate
key) :
• Khóa tự nhiên (natural key) : là định danh của bản ghi theo logic của dữ liệu, tức là định danh bản ghi (record) một cách tự nhiên Đôi khi khóa tự nhiên còn được gọi là business key Thông thường, với khóa chính dạng này, ta thường để cho nó kiểu chuỗi kí tự Và chính vì sử dụng
chuỗi kí tự nên sẽ tốn khá nhiều không gian lưu trữ, đồng thời làm cho tốc độ truy vấn bị chậm
đi Một vài ví dụ về khóa tự nhiên (natural key) mà ta hay gặp là : ISBN, Social security number, hay là TaxId Đối với khóa tự nhiên (natural key), ta sẽ dễ dàng tìm kiếm dữ liệu hơn, bởi vì khóa
tự nhiên thường có nghĩa Tuy nhiên, việc cập nhật lại khóa là vô cùng phức tạp, bởi vì nó có thể
sẽ ảnh hưởng đến tất cả bảng có liên quan
• Khóa đại diện (surrogate key) : là khóa không có liên hệ nào với dữ liệu mà chỉ hoàn toàn được dùng làm định danh (identity) cho bản ghi (record) Thông thường, đối với khóa dạng này, ta sẽ đặt giá trị cho nó là kiểu integer và identity Do đó, khi thêm 1 bản ghi (record), cột khóa chính (primary key) sẽ tự động tăng lên (auto increment) và có giá trị mới Thông thường, khi sử dụng khóa đại diện (surrogate key) kiểu integer thì sẽ tốn ít không gian lưu trữ hơn (1 int = 4 bytes đối với OS-64 bits), đồng thời tốc độ truy vấn cũng nhanh hơn so với khóa chính để kiểu chuỗi kí tự Đối với khóa dạng này, ta ít khi tìm kiếm (searching) dữ liệu dựa vào nó bởi vì khóa đại diện (surrogate key) thường vô nghĩa.
Do đó, trong thực tế, ta phải cân nhắc (debate) việc chọn lựa 2 loại khóa này và sử dụng chúng một cách
phù hợp
Đối với khóa đại diện (surrogate key), để tạo khóa có tính năng tự động tăng, ta sử dụng câu lệnh sau:
Đối với khóa tự nhiên (natural key), ta làm như sau:
Đầu tiên, tạo một sequence như một bộ đếm giá trị, giống như identity
Để lấy giá trị cuối cùng vừa được insert, ta dùng lệnh
Tự động tăng khóa chính lên 1 đơn vị
Trang 12Sau đó, ta tạo một thủ tục (procedure):
Cuối cùng, ta thực hiện việc gọi và cho kết quả
Giá trị sẽ không quay
Ép kiểu sang Lấy giá trị
tiếp theo
Trang 13TẢN MẠN VỀ CSDL – PHẦN 5
Chủ đề này, tôi xin mạn phép bàn về truncate và delete Cả 2 đều là xóa dữ liệu trong bảng, như vậy
chúng khác nhau ở điểm gì? Ở đây tôi xin mạn phép chỉ bàn về sql server, còn trên các ngôn ngữ truy
vấn khác thì có thể sẽ có những điểm khác biệt
TRUNCATE
Là ngôn ngữ định nghĩa dữ liệu –DDL (data defination language) Là ngôn ngữ thao tác dữ liệu- DML (data manipulation language
Truncate xóa toàn bộ dữ liệu trên bảng Có thể sử dụng điều kiện where khi delete
Nếu có khóa ngoại hoạt động, lệnh truncate không thể được thực hiện Nếu có lệnh cascade delete thì lệnh delete vẫn có thể hoạt động để xóa dòng dữ
liệu Chỉ được xóa bảng nằm trên cùng server Cho phép xóa bảng đối với những bảng được linked server
Không thể roll back sau khi delete Do hỗ trợ transaction, nên ta có thể roll back sau khi delete
Như vậy, tùy theo từng tình huống, ta có thể chọn giải pháp nào phù hợp với hiện trạng hiện tại nhất