Mô tả chuẩn hóa
Chuẩn hóa cơ sở dữ liệu là một quy trình thiết kế được sử dụng để sắp xếp dữ liệu vào các bảng và cột trong cơ sở dữ liệu. Mỗi bảng nên chứa dữ liệu liên quan đến một thực thể cụ thể và chỉ bao gồm thông tin hỗ trợ thực thể đó. Mục tiêu chính của chuẩn hóa là giảm thiểu dữ liệu trùng lặp trong cơ sở dữ liệu, giúp ngăn chặn tình trạng giảm hiệu suất trong quá trình chèn và cập nhật. Ví dụ: nếu địa chỉ của khách hàng cần được cập nhật, việc thực hiện thay đổi sẽ đơn giản hơn nếu địa chỉ được lưu trữ ở một vị trí duy nhất, Customers chẳng hạn như bảng.
Các hình thức chuẩn hóa phổ biến nhất là biểu mẫu bình thường đầu tiên, thứ hai và thứ ba.
Biểu mẫu bình thường đầu tiên
Biểu mẫu bình thường đầu tiên có các thông số kỹ thuật sau:
- Tạo một bảng riêng biệt cho mỗi bộ dữ liệu liên quan
- Loại bỏ nhóm lặp trong các bảng riêng lẻ
- Xác định từng tập hợp dữ liệu liên quan bằng khóa chính
Trong mô hình này, bạn nên tránh sử dụng nhiều cột trong một bảng để lưu trữ dữ liệu tương tự. Ví dụ: nếu một sản phẩm có thể có nhiều màu, bạn không nên có nhiều cột trong một hàng chứa các giá trị màu khác nhau. Bảng sau đây đầu tiên, ProductColors, không ở dạng bình thường đầu tiên vì nó có các giá trị màu lặp lại. Đối với các sản phẩm chỉ có một màu, sẽ lãng phí không gian. Ngoài ra, nếu một sản phẩm có nhiều hơn ba màu, nó sẽ trở nên không thực tế để đặt số lượng cột tối đa. Thay vào đó, chúng ta có thể tạo lại bảng như minh họa trong bảng thứ hai, ProductColor.
Biểu mẫu bình thường đầu tiên cũng yêu cầu có một khóa duy nhất cho bảng, là một cột (hoặc cột) có giá trị xác định duy nhất từng hàng. Trong bảng thứ hai, không cột nào là duy nhất riêng, nhưng cùng nhau, sự kết hợp giữa ProductID và Color tạo thành một khóa duy nhất. Khi cần nhiều cột để tạo một khóa duy nhất, khóa này được gọi là khóa tổng hợp.
ProductColorsbàn:#B0 ProductID #C1 #B0 Color1 #C1 #B0 Color2 #C1 #B0 Color3 #C1 1 Đỏ Xanh Vàng 2 Vàng 3 Xanh Đỏ 4 Xanh 5 Đỏ ProductColorbàn:#B0 ProductID #C1 Màu sắc 1 Đỏ 1 Xanh 1 Vàng 2 Vàng 3 Xanh 3 Đỏ 4 Xanh 5 Đỏ
Bảng thứ ba, ProductInfo, ở dạng bình thường đầu tiên vì mỗi hàng tham chiếu đến một sản phẩm cụ thể, không có nhóm lặp và chúng tôi có cột ProductID để sử dụng làm Khóa Chính.
| #B0 ProductID #C1 | #B0 productName #C1 | Giá | #B0 ProductionCountry #C1 | #B0 ShortLocation #C1 |
|---|---|---|---|---|
| 1 | Tiện ích | 15.95 | Hoa Kỳ | Chúng tôi |
| 2 | Rất tiếc | 41.95 | Vương quốc Anh | Vương quốc Anh |
| 3 | Glombit | 49.95 | Vương quốc Anh | Vương quốc Anh |
| Tệp 4 | Sorfin | 99.99 | Cộng hòa Phi-lip-pin | RepPhil |
| 5 | Chớp Gốc | 29.95 | Hoa Kỳ | Chúng tôi |
Biểu mẫu bình thường thứ hai
Biểu mẫu bình thường thứ hai có đặc tả sau đây, ngoài những yêu cầu của biểu mẫu bình thường đầu tiên:
- Nếu bảng có khóa tổng hợp, tất cả các thuộc tính phải phụ thuộc vào khóa hoàn chỉnh chứ không chỉ một phần của khóa.
Biểu mẫu bình thường thứ hai chỉ liên quan đến các bảng có khóa tổng hợp, chẳng hạn như ProductColortrong bảng , là bảng thứ hai. Hãy cân nhắc trường hợp bảng ProductColor cũng bao gồm giá của sản phẩm. Bảng này có khóa tổng hợp trên đó và ProductID , vì Colorchỉ sử dụng cả hai giá trị cột mới có thể xác định duy nhất một hàng. Nếu giá của một sản phẩm không thay đổi với màu sắc, chúng tôi có thể thấy dữ liệu như minh họa trong bảng này.
| #B0 ProductID #C1 | Màu sắc | Giá |
|---|---|---|
| 1 | Đỏ | 15.95 |
| 1 | Xanh | 15.95 |
| 1 | Vàng | 15.95 |
| 2 | Vàng | 41.95 |
| 3 | Xanh | 49.95 |
| 3 | Đỏ | 49.95 |
| 4 | Xanh | 99.95 |
| 5 | Đỏ | 29.95 |
Bảng này không ở dạng bình thường thứ hai. Giá trị giá phụ thuộc vào giá ProductID trị nhưng không phụ thuộc vào Color. Có ba hàng cho , vì vậy ProductID 1giá cho sản phẩm đó được lặp lại ba lần. Vấn đề với vi phạm hình thức bình thường thứ hai là nếu chúng tôi cần cập nhật giá cả, chúng tôi phải đảm bảo nó được cập nhật ở khắp mọi nơi. Nếu chúng tôi cập nhật giá ở hàng đầu tiên nhưng không cập nhật ở hàng thứ hai hoặc thứ ba, chúng tôi sẽ gặp phải sự cố bất thường khi cập nhật. Sau khi cập nhật, chúng tôi sẽ không thể xác định giá thực tế cho ProductID 1. Giải pháp là di chuyển Price cột ProductID sang bảng có khóa cột đơn, vì đó là cột duy nhất phụ Price thuộc. Ví dụ: chúng ta có thể sử dụng Bảng 3 để lưu trữ Price.
Nếu giá cho một sản phẩm khác nhau dựa trên màu sắc của nó, bảng thứ tư sẽ ở dạng bình thường thứ hai, vì giá sẽ phụ thuộc vào cả hai phần của khóa: ProductIDColorvà .
Biểu mẫu bình thường thứ ba
Biểu mẫu bình thường thứ ba thường là mục tiêu của hầu hết các cơ sở dữ liệu OLTP. Biểu mẫu bình thường thứ ba có đặc tả sau đây, ngoài những yêu cầu của biểu mẫu bình thường thứ hai:
- Tất cả các cột không khóa không phụ thuộc vào khóa chính.
Mối quan hệ chuyển tiếp ngụ ý rằng một cột trong bảng có liên quan đến các cột khác thông qua cột thứ hai. Phụ thuộc có nghĩa là một cột có thể lấy giá trị của nó từ một cột khác do mối quan hệ này. Ví dụ: tuổi của bạn có thể được xác định từ ngày sinh, làm cho tuổi của bạn phụ thuộc vào ngày sinh của bạn. Tham khảo lại bảng thứ ba, ProductInfo. Bảng này ở dạng bình thường thứ hai nhưng không phải ở dạng thứ ba. Cột ShortLocation phụ thuộc vào cột ProductionCountry , không phải là khóa. Giống như biểu mẫu bình thường thứ hai, vi phạm biểu mẫu bình thường thứ ba có thể dẫn đến bất thường khi cập nhật. Chúng tôi sẽ kết thúc ShortLocation với dữ liệu không nhất quán nếu chúng tôi cập nhật trong một hàng nhưng không cập nhật nó trong tất cả các hàng nơi vị trí đó xảy ra. Để ngăn chặn điều này, chúng tôi có thể tạo một bảng riêng biệt để lưu trữ tên quốc gia/khu vực và biểu mẫu rút gọn của chúng.
Không chuẩn hóa
Mặc dù về mặt lý thuyết, biểu mẫu bình thường thứ ba là mong muốn nhưng không phải lúc nào cũng có thể cho tất cả dữ liệu. Ngoài ra, cơ sở dữ liệu đã chuẩn hóa không phải lúc nào cũng mang lại cho bạn hiệu suất tốt nhất. Dữ liệu đã chuẩn hóa thường yêu cầu nhiều phép toán nối để trả về tất cả dữ liệu cần thiết trong một truy vấn duy nhất. Có một sự cân bằng giữa chuẩn hóa dữ liệu khi số lượng liên kết cần thiết để trả về kết quả truy vấn có mức sử dụng CPU cao và dữ liệu không được chuẩn hóa có ít kết nối hơn và yêu cầu CPU ít hơn, nhưng mở ra khả năng xảy ra bất thường khi cập nhật.
Dữ liệu không chuẩn hóa có thể hiệu quả hơn trong việc truy vấn, đặc biệt là để đọc khối lượng công việc nặng như kho dữ liệu. Trong những trường hợp đó, việc có thêm cột có thể cung cấp các mẫu truy vấn tốt hơn và/hoặc các truy vấn đơn giản hơn.
Sơ đồ ngôi sao
Trong khi bình thường hóa nhất là nhằm vào khối lượng công việc OLTP, kho dữ liệu có cấu trúc mô hình hóa riêng của họ, mà thường là một mô hình không chuẩn hóa . Thiết kế này sử dụng bảng dữ kiện để ghi lại số đo hoặc chỉ số cho các sự kiện cụ thể, chẳng hạn như doanh số và kết hợp chúng với bảng kích thước. Bảng chiều nhỏ hơn về mặt số hàng nhưng có thể có một số lượng lớn cột để mô tả dữ liệu thực tế. Ví dụ về kích thước bao gồm hàng tồn kho, thời gian và địa lý. Mẫu thiết kế này làm cho cơ sở dữ liệu dễ truy vấn hơn và cung cấp kết quả hiệu suất cho khối lượng công việc đọc.
Hình ảnh minh họa một ví dụ về sơ đồ ngôi sao, FactResellerSales bao gồm bảng dữ kiện và kích thước cho ngày, tiền tệ và sản phẩm. Bảng dữ kiện chứa dữ liệu liên quan đến giao dịch bán hàng, trong khi các chiều chỉ chứa dữ liệu liên quan đến các thành phần cụ thể của dữ liệu bán hàng. Ví dụ: bảng chỉ FactResellerSales bao gồm dấu a ProductKey để cho biết sản phẩm nào đã được bán. Tất cả chi tiết về từng sản phẩm đều được lưu trữ DimProduct trong bảng và có liên quan trở lại bảng dữ kiện bằng cách sử dụng ProductKey cột.
Liên quan đến thiết kế sơ đồ ngôi sao là sơ đồ bông tuyết, sử dụng một tập hợp các bảng chuẩn hóa hơn cho một thực thể kinh doanh duy nhất. Hình ảnh sau đây minh họa một ví dụ về một chiều duy nhất trong sơ đồ bông tuyết. Chiều Sản phẩm được chuẩn hóa và lưu trữ trên ba bảng: DimProductCategory, DimProductSubcategoryvà DimProduct.
Sự khác biệt chính giữa sơ đồ ngôi sao và bông tuyết là kích thước trong sơ đồ bông tuyết được chuẩn hóa để giảm dư thừa, giúp tiết kiệm không gian lưu trữ. Điểm cân bằng là các truy vấn của bạn yêu cầu kết nối nhiều hơn, điều này có thể làm tăng mức độ phức tạp và giảm hiệu suất của bạn.