Database

Mở đầu

Mình học lập trình đã được mấy năm và gần bằng ấy thời gian làm việc với database. Làm việc ở đây là viết các câu lệnh tạo bảng, thêm, xóa, sửa, viết các câu query, nâng cao hơn tí là viết function, proceduce, trigger là cùng. Nếu ai đó hỏi mình những thứ cơ bản như chuẩn 1, chuẩn 2, chuẩn 3 là gì, hay những thứ nâng cao hơn như thiết kế database theo chiều dọc, ngang, hay về hiệu suất như đánh index hoặc những công nghệ mới như nosql (key - value, document, column family, graph) thì mình không biết phải trả lời thế nào. Vì mình là junior dev chưa va vấp đến vấn đề lớn, phải thiết kế sao cho hợp lý. Và nếu bạn cũng đang như mình, nghĩa là có một vài câu ở trên chưa trả lời được thì có lẽ là nên đọc bài viết này. Chúng ta sẽ cùng tổng hợp lại từ các bài viết, các cuốn sách. Thông tin trên internet thì hỗn loạn, lại theo ý hiểu chủ quan của mình có thể sẽ làm sai lệch. Mong các bạn góp ý.

Chuẩn hóa cơ sở dữ liệu

Chuẩn hóa cơ sở dữ liệu để tránh dữ thừa dữ liệu và các lỗi khi thao tác thêm, sửa, xóa. Hồi thầy mình có nói việc chuẩn hóa làm tăng thời gian truy vấn vì việc join các bảng là tốn thời gian. Thầy có đưa ví dụ về cơ sở dữ liệu truy vấn điểm thi khi các thầy làm dữ liệu chuẩn hóa lượng truy vấn lớn (nhiều học sinh xem điểm) rất chậm, cuối cùng gộp các bảng lên tới 80 cột. Mình cũng nghe nói trên thực tế các ứng dụng thường đạt đến chuẩn 2. Mình đi làm thậm chí đến cuối dự án không muốn chỉnh sửa database còn lưu một trường dưới dạng json :D. Còn bài tập lớn, dự án của mình thì nó còn linh tinh nữa. OK nhưng việc học vẫn phải hàn lâm. Mình có xem một số bài viết về chuẩn hóa cơ sở dữ liệu nhưng bản thân mình thấy không thỏa mãn (vẫn chưa hiểu lắm :D). Nên mình sẽ dịch bài từ wikipedia https://en.wikipedia.org/wiki/Database_normalization Chuẩn hóa cơ sở dữ liệu là quá trình cấu trúc cơ sở dữ liệu quan hệ theo một số chuẩn gọi là normal forms để giảm data redundancy *dư thừa dữ liệu và tăng *data integrity toàn vẹn dữ liệu. Nó được đề xuất bởi Edgar F.Codd như là một phần không thể thiếu trong mô hình quan hệ của ông. Chuẩn hóa đồi hỏi tổ chức các cột (thuộc tính) và các bảng (quan hệ) của cơ sở dữ liệu để đảm bảo rằng các dependencies của chúng được đảm bảo bởi các ràng buộc toàn vẹn database. Chuẩn hóa bằng cách áp dụng một vài luật với một tiến trình synthesis (tạo mới một database design) hoặc decomposition (cải thiện một database design có sẵn).

Nhiệm vụ của chuẩn hóa cơ sở dữ liệu

Một nhiệm vụ của first normal form (chuẩn 1NF) được định nghĩa bởi Codd trong năm 1970 cho việc thao tác và truy vấn dữ liệu sử dụng một “universal data sub-language” (SQL là một ví dụ như một data sub-language), mặc dụ Codd đã coi nó là một thiếu sót nghiệm trọng. Nhiệm vụ của chuẩn 1 đã được nêu bởi Codd (các bạn có thể bỏ qua phần này, mình không hiểu rõ lắm, có lẽ SQL có mặt năm 1974 thì năm 1971 còn đang trung cổ lắm nên mục đích nó là thế này):

  1. Độc lập các collection của relations(bảng) từ các phụ thuộc thêm xóa sửa.
  2. Giảm việc phải tái cấu trúc các bảng, như một kiểu dữ liệu mới, như là tăng thời gian sống của một chương trình.
  3. Giúp mô hình dữ liệu thêm thông tin (more informative) cho người dùng.
  4. Tạo tập dữ liệu các quan hệ để truy vấn, nơi mà việc thống kê dữ liệu là thay đổi theo thời gian.

Khi thêm xóa sửa một bảng sẽ có ảnh hưởng không mong muốn tới các bản khi chưa chuẩn hóa: *Update anomaly: *Các thông tin giống nhau trên nhiều dòng, việc cập nhật dữ liệu có thể làm mâu thuẫn logic. Ví dụ, mỗi bản ghi trong một Employees Skills bao gồm Employee ID, Employee Address và Skill, một thay đổi địa chỉ cho một employee có thể cần được áp dụng lên tất cả các bản ghi cho mỗi skill. Nếu chỉ cập nhật một phần, employee address được cập nhật trên một vài bản ghi nhưng không cho những bản ghi còn lại, sau đó bảng sẽ trong tình trạng không thống nhất. Đặc biệt khi bảng cung cấp một câu trả lời mâu thuẫn cho câu hỏi địa chỉ của nhân viên này là gì?. *Insertion anomaly. *Có một vài trường hợp không thể lưu trữ tất cả. Lấy ví dụ, mỗi một bản ghi trong Faculty và Their Course phải có Faculity ID, Faculty phải có Course Code *Deletion anomaly. * Tóm lại việc chuẩn hóa cơ sở dữ liệu giúp giải quyết được các vấn đề khi thêm, xóa, sửa dữ liệu. Còn bạn vẫn chưa biết phải làm thế nào để giải quyết thì chúng ta tiếp tục.

Thiết kế tối giản khi mở rộng cấu trúc cơ sở dữ liệu

Một cơ sở dữ liệu được chuẩn hóa cho phép cấu trúc của nó có thể mở rộng với các kiểu dữ liệu mới mà không thay đổi cấu trúc đã có quá nhiều. Quan hệ được chuẩn hóa, các mối quan hệ giữa các quan hệ được chuẩn hóa.

Normal Forms

Codd giới thiệu các khái niệm của normalization và được biết như là chuẩn 1 năm 1970. Codd tiếp tục định nghĩa chuẩn 2NF và 3NF trong năm 1971 và Code cùng Raymond F.Boyce định nghĩa Boyce-Codd normal form (BCNF) trong năm 1974. Không chính thức, một cơ sở dữ liệu quan hệ thường được mô tả là normalized nếu nó đạt được chuẩn 3. Chuẩn 3NF thoải mái với vấn đề thêm xóa sửa dị thường.

Một hình ảnh bằng cả ngàn từ ngữ. Primary key (no duplicate tuples): Bảng nào cũng phải có khóa chính (khóa chính là tập hợp không trùng lặp) No repeating groups: Không có dữ liệu lặp lại Atomic columns (cells have single value): Mỗi cột có một giá trị đơn. *First normal form: *

  • Loại bỏ các nhóm lặp lại
  • Tạo các bảng riêng cho tập dữ liệu liên quan
  • Chỉ định khóa chính với các dữ liệu liên quan

Ok sai *Atomic columns *chúng ta sẽ làm phẳng bằng việc tách cột Bảng đã đạt atomic, tuy nhiên việc tạo hai cột số điện thoại vẫn là một dạng *repeating group, *về mặt khái niệm giống thuộc tính, tên. Tại sao đặt số điện thoại trong Telephone number1 mà không phải Telephone number2, và không có lý do gì mà khách hàng không có nhiều hơn hai số điện thoại, vì thế có nên cho Telephone NumberN. Không thể tìm kiếm số điện thoại với việc tìm kiếm số cột tùy ý. Việc thêm số điện thoại có thể yêu cầu phải tổ chức lại bảng cho các cột mới hơn là chỉ thêm một dòng mới. Để mang mô hình về dạng chuẩn 1. Chúng ta sẽ chia thành các dòng và đảm bảo không có dòng nào trung nhau. ID là một giá trị không trùng lặp. Ta tách tiếp

Kết thúc