Sau giai đoạn thiết kế ở mức khái niệm ta đã thu được lược đồ thực thể - liên kết, là sự trình bày cấu trúc chung của cơ sở dữ liệu ở mức đơn giản. Tuy nhiên ở mức khái niệm, ta chưa xem xét chi tiết các thành phần của cấu trúc ấy, chưa lưu ý tới những điểm đặc thù của những thành phần này, chưa quan tâm đến các ràng buộc mà những thành phần ấy phải đáp ứng. Vì thể các hệ quản trị cơ sở dữ liệu chưa thể sử dụng lược đồ này để xây dựng nên cơ sở dữ liệu. Do đó ta cần tiến hành giai đoạn tiếp theo: thiết kế ở mức logic.
Trong giai đoạn thiết kế ở mức logic, ta phải chuyển hóa từ lược đồ quan hệ thực thể - liên kết ở mức khái niệm thành lược đồ quan hệ ở mức logic. Để làm được điều ấy, ta cần xem xét chi tiết hơn các thành phần của cơ sở dữ liệu, xử lý các trường hợp chuyên biệt, và giải quyết các ràng buộc. Nhìn chung quá trình chuyển hóa này gồm 6 bước sau:
Chúng ta sẽ xem xét cách thực hiện các bước trên trong phần sau.
Trong quá trình chuyển hóa từ mức khái niệm sang mức logic, ta thấy có ba loại thực thể sau:
Việc chuyển hóa các thực thể thường tương đối đơn giản. Phương pháp chung là:
Khi ta chọn và đặt tên các thuộc tính và khóa chính, phải đảm bảo rằng chúng thỏa mãn các ràng buộc đặt ra cho mô hình quan hệ. Ở đây ta có hai trường hợp cần lưu ý là thuộc tính kết hợp và thuộc tính đa trị.
Như ta đã biết, thuộc tính kết hợp (composite) có thể được phân chia thành một số thuộc tính đơn. Thí dụ thuộc tính HoTen có thể được tách thành 3 thuộc tính đơn là họ, tên và tên lót. Ta cũng đã biết rằng mô hình quan hệ chỉ chấp nhận thuộc tính đơn. Như vậy để thỏa mãn ràng buộc này, ta có hai phương án sau:
Nhìn chung phương án hai có nhiều ưu điểm hơn do khả năng truy cập tăng lên, có nhiều phương án để truy vấn hơn, chất lượng dữ liệu tốt hơn, việc bảo trì hệ cơ sở dữ liệu dễ dàng hơn.
Do mô hình quan hệ chỉ chấp nhận thuộc tính đơn trị, nên nếu thực thể thường chứa thuộc tính đa trị ta phải chuyển đổi như sau:
Theo cách trên, trong bước đầu, các quan hệ Q_TT sẽ không có thuộc tính không khóa. Tuy vậy ta vẫn có thể thêm vào các quan hệ Q_TT này các thuộc tính không khóa nếu cần thiết.
Như đã trình bày ở phần trên, thực thể yếu là một thực thể mà sự tồn tại của nó phụ thuộc vào sự tồn tại của một thực thể khác (thực thể chủ). Để chuyển thực thể yếu thành quan hệ, ta thực hiện như sau:
Phương pháp chuyển hóa liên kết bậc 2 ở lược đồ thực thể - liên kết phụ thuộc vào loại liên kết.
Đối với liên kết một-nhiều ta thực hiện như sau:
Đối với liên kết một-một, ta cũng làm tương tự, lấy khóa chính của quan hệ này làm khóa ngoại của quan hệ kia. Nhưng trong trường hợp này, lấy khóa chính của quan hệ phía nào không có nhiều ý nghĩa.
Liên kết bậc 1, còn được gọi là liên kết đệ quy (recursive), xẩy ra giữa những cá thể trong cùng một thực thể. Có hai loại liên kết bậc 1 chủ yếu là liên kết một-nhiều và liên kết nhiều-nhiều.
Liên kết bậc 1 một-nhiều
Ta chuyển thực thể thành quan hệ như đã được đề cập ở Bước 1. Sau đó ta thêm vào quan hệ này một thuộc tính "khóa ngoại", hay khóa đệ quy, thể hiện liên kết bậc 1. Thuộc tính này có cùng miền xác định với khóa chính của quan hệ và tham chiếu (reference) đến khóa chính này.
Liên kết bậc 1 nhiều-nhiều
Cách giải quyết cũng gần tương tự như trường hợp liên kết nhiều-nhiều bậc 2: ta tạo thêm một quan hệ kết hợp và chuyển một liên kết bậc 1 nhiều-nhiều thành hai liên kết bậc 2 một-nhiều
Trong trường hợp có liên kết bậc ba giữa 3 thực thể A, B, C, ta chuyển liên kết này thành một quan hệ kết hợp K có liên kết đến cả ba quan hệ tương ứng Q_A, Q_B và Q_C. Ta cũng đưa các khóa chính của các quan hệ này vào làm thuộc tính của K, và bộ các khóa chính này tạo thành khóa chính của K.
Trong trường hợp liên kết có bậc lón hơn ba, cách thực hiện cũng tương tự.
Trong một số trường hợp, các cá thể của một thực thể nào đó có thể chia làm một số nhóm dựa theo sự giống nhau về một số mặt nào đó. Thí dụ tập thể các nhân viên của một công ty có thể xem như gồm 3 nhóm: các công nhân tham gia trực tiếp sản xuất, các nhân viên văn phòng, các cán bộ quản lý. Và ta có thể xem mỗi nhóm đó như một thực thể riêng biệt. Từ đó phát sinh các khái niệm thực thể chung (supertype) và thực thể nhóm riêng (subtype).
Tất cả các thực thể nhóm riêng đều có một số thuộc tính giống nhau kế thừa từ thực thể chung, nhưng mỗi nhóm riêng đều có những thuộc tính riêng của nó. Tương tự, các nhóm riêng đều tham gia liên kết giữa thực thể chung với những thực thể khác, nhưng mỗi nhóm riêng có thể tham gia những liên kết của riêng mình.
Để chuyển hóa các thực thể thuộc dạng này, ta thực hiện như sau:
Ghi chú : Ta chỉ cần thực hiện các bước trên khi có một vài nhóm riêng tham gia những liên kết riêng. Nếu không, việc phân chía thực thể chung / thực thể nhóm riêng và chuyển hóa là không có ý nghĩa.
Trong một số trường hợp, thay vì sử dụng một thuộc tính có sẵn, tự nhiên, như họ tên chẳng hạn, để làm khóa chính, ta lại tạo ra một khóa chính mới và gán giá trị của khóa chính này cho các cá thể theo một phương thức nào đó. Loại khóa chính này được gọi là khóa đại diện (surrogate key).
Ta nên cân nhắc thêm việc sử dụng khóa đại diện này thay cho khóa tự nhiên trong những trường hợp sau:
Một ưu điểm khác khi dùng khóa đại diện là khi ấy, các khóa tự nhiên chuyển thành các thuộc tính không khóa. Điều này làm tăng khả năng truy vấn và giảm công sức khi bảo trì cơ sở dữ liệu.
Ta sẽ tiếp tục thí dụ về công ty bánh kẹo với 4 thực thể NHA_CUNG_UNG, NGUYEN_LIEU, SAN_PHAM, và KHACH_HANG mà ta đã đề cập ở các phần trước. Ta đã xây dựng được lược đồ thực thể - liên kết ở mức khái niệm như ở Hình 1.
Hình 1 Lược đồ mô hình thực thể - liên kết ở mức khái niệm
Ta sẽ tiếp tục chuyển hóa lược đồ này thành mô hình quan hệ ở mức logic theo phương pháp đã trình bày ở trên.
Trước hết ta sẽ chuyển 4 thực thể thành 4 quan hệ tương ứng. Để đơn giản, ta sẽ dùng lại tên của các thực thể để đặt tên cho các quan hệ.
Sau đó, ta xác định các thuộc tính và khóa chính cho các quan hệ ấy. Ta có kết quả sơ bộ như sau:
NHA_CUNG_UNG (MaSo_NCU, Ten_NCU, MoTa_NCU, DiaChi_NCU, DienThoai_NCU)
NGUYEN_LIEU (MaSo_NL, Ten_NL, MoTa_NL, Nhom_NL, DonVi_NL, LuongTon_NL, LuongNhap_NL, LuongSuDung_NL, DonGia_NL)
SAN_PHAM (MaSo_SP, Ten_SP, MoTa_SP, nhom_SP, donvi_SP, LuongTon_SP, LuongSanXuat_SP, LuongXuat_SP, DonGiaThanh_SP, DonGiaBan_SP, HeSoGiaBan_SP)
KHACH_HANG (MaSo_KH, Ten_KH, MoTa_KH, Loai_KH, DiaChi_KH, DienThoai_KH)
Khi xem xét chi tiết hơn những thuộc tính của bốn quan hệ trên, ta thấy như sau:
Dien_Thoai_NCU (MaSo_NCU, SoDienThoai_NCU)
Dien_Thoai_KH (MaSo_KH, soDienThoai_KH)
Ghi chú : Về thực chất, ba quan hệ Dien_Thoai_NCU, Dien_Thoai_KH, và Dia_Chi_KH là các thực thể yếu vì sự tồn tại của chúng phụ thuộc vào sự tồn tại của các quan hệ NHA_CUNG_UNG và KHACH_HANG. Tuy nhiên do ta đã tiến hành giải quyết ba quan hệ này ở Bước 1 nên ta không cần tiến hành Bước 2 cho ba quan hệ ấy.
Trong mô hình thực thể - liên kết, cả 3 liên kết đều thuộc loại nhiều-nhiều. Để chuyển các liên kết này, trong mô hình quan hệ ta tạo thêm 3 quan hệ kết hợp mới:
KetHop_NCU_NL (MaSo_NCU, MaSo_NL).
KetHop_NL_SP (MaSo_NL, MaSo_SP).
KetHop_KH_SP (MaSo_KH, MaSo_SP).
Sau khi đã tiến hành chuyển hóa các thực thể, các quan hệ và xử lý các phát sinh trong quá trình chuyển hóa này, cơ sở dữ liệu có mô hình quan hệ gồm các quan hệ và thuộc tính được trình bày trong Bảng 1.
Quan hệ | Thuộc tính | Ý nghĩa của thuộc tính |
---|---|---|
NHA_CUNG_UNG | MaSo_NCU | Mã số của nhà cung ứng |
Ten_NCU | Tên của nhà cung ứng | |
MoTa_NCU | Mô tả ngắn gọn về nhà cung ứng | |
DiaChi_NCU | Địa chỉ liên hệ của nhà cung ứng | |
Dien_Thoai_NCU | MaSo_NCU | Mã số của nhà cung ứng |
SoDienThoai_NCU | Số điện thoại của nhà cung ứng | |
KetHop_NCU_NL | MaSo_NCU | Mã số của nhà cung ứng |
MaSo_NL | Mã số của nguyên liệu | |
NGUYEN_LIEU | MaSo_NL | Mã số của nguyên liệu |
Ten_NL | Tên của nguyên liệu | |
Nhom_NL | Nhóm của nguyên liệu | |
MoTa_NL | Mô tả ngắn gọn về nguyên liệu | |
DonVi_NL | Đơn vị tính của nguyên liệu | |
LuongTon_NL | Lượng nguyên liệu tồn vào đầu kỳ | |
LuongNhap_NL | Lượng nguyên liệu nhập trong kỳ | |
LuongSuDung_NL | Lượng nguyên liệu sử dụng trong kỳ | |
DonGia_NL | Đơn giá của nguyên liệu | |
KetHop_NL_SP | MaSo_NL | Mã số của nguyên liệu |
MaSo_SP | Mã số của sản phẩm | |
SAN_PHAM | MaSo_SP | Mã số của sản phẩm |
Ten_SP | Tên của sản phẩm | |
Nhom_SP | Nhóm sản phẩm | |
MoTa_SP | Mô tả ngắn gọn về sản phẩm | |
DonVi_SP | Đơn vị tính của sản phẩm | |
LuongTon_SP | Lượng sản phẩm tồn vào đầu kỳ | |
LuongXuat_SP | Lượng sản phẩm xuất bán trong kỳ | |
LuongSanXuat_SP | Lượng sản phẩm sản xuất trong kỳ | |
DonGiaThanh_SP | Giá thành của đơn vị sản phẩm | |
DonGiaBan_SP | Giá bán chuẩn của đơn vị sản phẩm | |
HeSoGiaBan_SP | Hệ số giá bán của đơn vị sản phẩm | |
KetHop_KH_SP | MaSo_KH | Mã số của khách hàng |
MaSo_SP | Mã số của sản phẩm | |
KHACH_HANG | MaSo_KH | Mã số của khách hàng |
Ten_KH | Tên của khách hàng | |
MoTa_KH | Mô tả ngắn gọn về khách hàng | |
Loai_KH | Loại khách hàng | |
Dia_Chi_KH | MaSo_KH | Mã số của khách hàng |
DiaChi_KH | Địa chỉ khách hàng trong tỉnh / thành phố | |
TinhThanh_KH | Tỉnh hay Thành phố của địa điểm kinh doanh của khách hàng | |
KhuVuc_KH | Khu Vực nơi đặt địa điểm kinh doanh của khách hàng | |
Dien_Thoai_KH | MaSo_KH | Mã số của khách hàng |
SoDienThoai_KH | Số điện thoại của khách hàng |
Từ kết quả này, ta có thể xây dựng được lược đồ của mô hình quan hệ ở mức logic như trên Hình 2.
Hình 2 Lược đồ của mô hình quan hệ ở mức logic
Ghi chú : Hình 2 được xây dựng với sự hỗ trợ của phần mềm Toad Data Modeler. Bạn có thể tải phiên bản miễn phí của phần mềm này tại https://www.toadworld.com/p/downloads. Do ngôn ngữ của phần mềm này là tiếng Anh, cho nên trong Hình 2, PK nghĩa là khóa chính (Primary Key), PFK là khóa ngoại (Primary Foreign Key).
Trang web này được cập nhật lần cuối ngày 25/11/2018
Cơ sở dữ liệu
Các chuyên đề
Xử lý dữ liệu
Ma trận
R