0

SQL Antipatterns - Phần 1 - Thiết kế cơ sở liệu làm sao để tốt hơn

THIẾT KẾ CƠ SỞ DỮ LIỆU

Về việc thiết kế cơ sở dữ liệu cần lưu ý các vấn đề sau

1. Tránh lưu trữ giá trị dạng đa giá trị

Không sử dụng các trường lưu trữ dạng 1 cột nhiều giá trị

VD: bảng USER không nên tạo 1 trường PHONG_BAN_IDS chứa giá trị dạng ID1, ID2 … kiểu 1,2,3

2. Tránh lưu trữ bảng dạng đệ quy phụ thuộc

Không sử dụng kiểu trong 1 bảng, khóa ngoại lại trỏ vào khóa chính của bảng đó

Ví dụ: Bảng Category thường sẽ là CategoryID, ParentCategoryID, Name

Bạn có thể tạo ra 1 bảng

Bảng Category (CategoryID, Name)

Và bảng Category_Xref (CategoryID, ParentCategoryID) làm bảng quan hệ cha-con

3. Khóa chính luôn tồn tại trong bảng

Bất kỳ bảng nào cũng nên có khóa chính

Mục tiêu là khi truy cập vào 1 bản ghi trong bảng rất dễ dàng theo khóa chính để thao tác như cập nhật, xóa.

Kiểm tra trùng lặp bản ghi (dựa vào khóa chính đã có)

Không đặt tên khóa chính tên dạng chung chung như (ID)

Thay vì đặt tên khóa chính cho một bảng tên là Id thì chúng ta nên đặt tên có ý nghĩa hơn như: CategoryID, UserID, DepartmentID

Mục đích là khi tạo các mối quan hệ giữa các bảng thì bạn có thể nhìn thấy luôn khóa ngoại là của bảng nào, tương ứng với khóa chính ở bảng nào

VD: Không nên: Category (ID, Name, Note)

Nên: Category (CategoryID, CategoryName, Note), Product (ProductID, ProductName, CategoryID)

4. Xem xét thêm khóa ngoại cho bảng nếu cần thiết

Một số trường hợp bỏ khóa ngoại thì có vẻ sẽ giúp cho DB nhẹ hơn, linh hoạt hơn, tuy nhiên đánh đổi lại là chúng ta phải tự quản lý tính toàn vẹn dữ liệu. Đôi khi cái giá phải trả là rất đắt.

Thêm khóa ngoại sẽ giúp việc ràng buộc dữ liệu chặt chẽ, nên thêm đối với những chức năng cần tính ràng buộc dữ liệu chặt chẽ.

5. Không tạo nhiều cột để lưu các giá trị khác nhau của một thuộc tính

Ví dụ: Không nên: USER (UserID, Active, InActive)

Nên USER (UserID, STATUS_ID), USER_STATUS (STATUS_ID, STATUS_NAME) với giá trị STATUS_ID là 1: Active, 2: InActive

6. Chia nhỏ dữ liệu của một bảng hoặc theo năm

Có thể đánh partition theo năm cho bảng dữ liệu

Tham khảo bài gốc: SQL ANTIPATTERNS: PHẦN 1 - TỐI ƯU HÓA THIẾT KẾ CƠ SỞ DỮ LIỆU


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí