logo xDuLieu.com

Trang trướcThiết kế cơ sở dữ liệu ở mức logicTrang sau

Khái quát

 

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:

  1. chuyển hóa các thực thể thường,
  2. chuyển hóa các thực thể yếu,
  3. chuyển hóa các liên kết bậc 2,
  4. chuyển hóa các liên kết bậc 1,
  5. chuyển hóa các liên kết bật 3 và cao hơn
  6. chuyển hóa các thực thể chung / thực thể nhóm riêng

Chúng ta sẽ xem xét cách thực hiện các bước trên trong phần sau.


Bước 1 Chuyển hóa các thực thể thường

 

Các loại thực thể

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:

  • thực thể thường (regular), cũng còn được gọi là thực thể mạnh (strong), là thực thể mà sự tồn tại của nó không phụ thuộc vào thực thể nào khác. Đây là loại thực thể thường gặp trong thế giới thực.
  • thực thể yếu (weak) : là một thực thể chỉ tồn tại khi có sự tồn tại của thực thể khác (thực thể chủ - owner).
  • thực thể kết hợp (associative) : được tạo ra từ những thực thể khác khi chúng tham gia vào liên kết nhiều-nhiều.

Bước 1 Chuyển hóa thực thể thường

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à:

  • mỗi thực thể thường từ lược đồ thực thể - liên kết sẽ chuyển thành một quan hệ trong mô hình logic,
  • với mỗi quan hệ, ta xác định các thuộc tính của nó,
  • xác định thuộc tính định danh và chọn thuộc tính này làm khóa chính.

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ị.


Thuộc tính kết hợp

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:

  • thứ nhất, xem thuộc tính kết hợp như một thuộc tính đơn (thí dụ HoTen),
  • thứ hai, chuyển thuộc tính kết hợp thành một số thuộc tính đơn và xem là các thuộc tính của quan hệ mà không dùng thuộc tính kết hợp (thí dụ không dùng HoTen làm thuộc tính mà dùng 3 thuộc tính Ho, Ten, TenLot).

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.


Thuộc tính đa trị

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:

  • Nếu thực thể thường chứa một thuộc tính đa trị TT, ta chuyển đổi thực thể ấy thành quan hệ, tạm gọi là Q_A, chứa tất cả các thuộc tính của thực thể trừ thuộc tính đa trị TT.
  • Chọn khóa chính của quan hệ Q_A, tạm gọi là KC_A
  • Tạo một quan hệ Q_TT, có các thuộc tính là KC_A và thuộc tính đa trị TT. Nhóm các thuộc tính này sẽ tạo thành khóa chính của quan hệ Q_TT.
  • Khi ấy mỗi một bộ trong quan hệ Q_TT chỉ chứa một giá trị của TT.
  • Nếu thực thể thường chứa nhiều thuộc tính đa trị TT_i, thì mỗi thuộc tính đa trị sẽ tương ứng với một quan hệ mới Q_TT_i theo cách ở trên.

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.


Bước 2 Chuyển hóa các thực thể yếu

 

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:

  • Tạo một quan hệ QY tương ứng với thực thể yếu đang xem xét, các thuộc tính của quan hệ QY cũng là các thuộc tính của thực thể yếu.
  • Chọn khóa chính tạm KCt_Y cho quan hệ QY
  • Đưa khóa chính của thực thể chủ KC_C làm thuộc tính của quan hệ QY.
  • Khóa chính chính thức của QY gồm khóa chính tạm KCt_Y và thuộc tính KC_C

Bước 3 Chuyển hóa các liên kết bậc 2

 

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.

Liên kết một-nhiều và liên kết một-một

Đối với liên kết một-nhiều ta thực hiện như sau:

  • Trước hết tạo hai quan hệ tương ứng với hai thực thể tham gia vào liên kết theo cách đã trình bày ở Bước 1.
  • Lấy khóa chính của quan hệ ở phía "một" để làm khóa ngoại của quan hệ phía "nhiều".

Đố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 nhiều-nhiều

  • Trước hết tạo hai quan hệ A và B tương ứng với hai thực thể tham gia vào liên kết theo cách đã trình bày ở Bước 1.
  • Chuyển liên kết nhiều-nhiều giữa A và B thành hai liên kết một-nhiều bằng cách tạo thêm quan hệ K có hai liên kết một-nhiều với A và B với nhánh nhiều ở phía K. Quan hệ K này được gọi là quan hệ kết hợp.
  • Đến đây ta có thể có hai trường hợp
    • Nếu người ta không gán tính chất hay thuộc tính gì cho liên kết nhiều-nhiều thì ta lấy các khóa chính KC_A và KC_B của hai quan hệ A và B làm thuộc tính của quan hệ K và dùng chúng làm khóa chính của K.
    • Nếu người ta gán một tính chất hay thuộc tính nào đó cho liên kết nhiều-nhiều thì ta vẫn lấy các khóa chính KC_A và KC_B của hai quan hệ A và B làm thuộc tính của quan hệ K, nhưng sử dụng tính chất hay thuộc tính của liên kết để tạo ra khóa chính của K.

Bước 4 Chuyển hóa các liên kết bậc nhất

 

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


Bước 5 Chuyển hóa các liên kết bậc 3 và cao hơn

 

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ự.


Bước 6 Chuyển hóa các thực thể chung và thực thể nhóm riêng

 

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:

  • Với mỗi thực thể, chung hay nhóm riêng, ta chuyển thành một quan hệ, gọi tắt là quan hệ chung và quan hệ nhóm riêng theo thứ tự.
  • Đưa vào quan hệ chung các thuộc tính chung cho tất cả các cá thể của quan hệ này, rồi chọn ra khóa chính.
  • Với mỗi quan hệ nhóm riêng, xác định các thuộc tính đặc thù của nhóm riêng ấy. Đưa cả khóa chính của quan hệ chung làm thuộc tính cho các quan hệ nhóm riêng.
  • Đưa vào quan hệ chung một thuộc tính dùng để phân biệt các nhóm riêng với nhau.

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.


Khóa đại diện

 

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:

  • khóa tự nhiên ở dạng kết hợp từ nhiều thuộc tính,
  • sử dụng khóa tự nhiên ảnh hưởng xấu đến chất lượng dữ liệu, làm việc truy vấn khó khăn hơn do phải móc nối đến một số quan hệ khác nhau,
  • khóa tự nhiên có khả năng bị trùng lặp lại trong tương lai.

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.


Thí dụ

 

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.

NHA_CUNG_UNGNGUYEN_LIEUKHACH_HANGSAN_PHAM

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.

Chuyển thực thể thành quan hệ

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:

  • Với quan hệ NHA_CUNG_UNG, ta chọn các thuộc tính sau: tên của nhà cung ứng, mô tả ngắn gọn về nhà cung ứng này, địa chỉ, số điện thoại liên lạc, và để thuận tiện ta gán cho mỗi nhà cung ứng một mã số và dùng mã số này làm khóa chính cho NHA_CUNG_UNG. Vậy ta có định nghĩa sau về quan hệ này:

    NHA_CUNG_UNG (MaSo_NCU, Ten_NCU, MoTa_NCU, DiaChi_NCU, DienThoai_NCU)

  • Với quan hệ NGUYEN_LIEU, ta chọn các thuộc tính sau: tên của nguyên vật liệu, bao bì hay tiện ích (gọi tắt là nguyên liệu), mô tả ngắn gọn về nguyên liệu, nhóm nguyên liệu, đơn vị tính cho nguyên liệu này, số lượng nguyên liệu tồn trong kho ở đầu kỳ, số lượng nguyên liệu nhập trong kỳ, số lượng nguyên liệu sử dụng trong kỳ, đơn giá của nguyên liệu, và cũng như trên ta gán cho mỗi nguyên liệu một mã số và dùng mã số này làm khóa chính cho NGUYEN_LIEU. Vậy ta có định nghĩa sau về quan hệ này:

    NGUYEN_LIEU (MaSo_NL, Ten_NL, MoTa_NL, Nhom_NL, DonVi_NL, LuongTon_NL, LuongNhap_NL, LuongSuDung_NL, DonGia_NL)

  • Với quan hệ SAN_PHAM, ta chọn các thuộc tính sau: tên của sản phẩm, mô tả ngắn gọn về sản phẩm, nhom_SP, đơn vị tính của sản phẩm này, số lượng sản phẩm tồn trong kho ở đầu kỳ, số lượng sản phẩm sản xuất trong kỳ, số lượng sản phẩm xuất bán trong kỳ, đơn giá thành của sản phẩm, đơn giá bán của sản phẩm, hệ số giá bán, và cũng như trên ta gán cho mỗi sản phẩm một mã số và dùng mã số này làm khóa chính cho SAN_PHAM. Vậy ta có định nghĩa sau về quan hệ này:

    SAN_PHAM (MaSo_SP, Ten_SP, MoTa_SP, nhom_SP, donvi_SP, LuongTon_SP, LuongSanXuat_SP, LuongXuat_SP, DonGiaThanh_SP, DonGiaBan_SP, HeSoGiaBan_SP)

  • Với quan hệ KHACH_HANG, ta chọn các thuộc tính sau: tên của nhà khách hàng, mô tả ngắn gọn về khách hàng, phân loại khách hàng, địa chỉ, số điện thoại liên lạc, và để thuận tiện ta gán cho mỗi khách hàng một mã số và dùng mã số này làm khóa chính cho KHACH_HANG. Vậy ta có định nghĩa sau về quan hệ này:

    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:

  • Vì mỗi nhà cung ứng cũng như khách hàng có thể có một số số điện thoại khác nhau để liên lạc nên thuộc tính này là thuộc tính đa trị. Vì thế ta sẽ loại bỏ thuộc tính này ở hai quan hệ NHA_CUNG_UNG và KHACH_HANG. Thay vào đó, ta tạo hai quan hệ mới Dien_Thoai_NCU và Dien_Thoai_KH, mỗi quan hệ tạm thời có hai thuộc tính, một để lưu giữ số điện thoại, một là khóa chính từ quan hệ NHA_CUNG_UNG hay KHACH_HANG đưa sang. Vậy ta có định nghĩa hai quan hệ này như sau:

    Dien_Thoai_NCU (MaSo_NCU, SoDienThoai_NCU)

    Dien_Thoai_KH (MaSo_KH, soDienThoai_KH)

  • Một số khách hàng, chẳng hạn CO.OPMart có nhiều địa điểm kinh doanh khác nhau, vì thế địa chỉ khách hàng cũng được xem là thuộc tính đa trị. Vì thế ta loại bỏ thuộc tính này khỏi quan hệ KHACH_HANG và tạo thêm quan hệ mới Dia_Chi_KH chứa hai thuộc tính, một để lưu giữ địa chỉ của địa điểm liên hệ và một là khóa chính của quan hệ KHACH_HANG.
  • Với địa chỉ liên hệ của khách hàng, trong bước đầu ta xem như một thuộc tính đơn. Tuy nhiên ta muốn rằng ta có thể sử dụng số liệu của cơ sở dữ liệu này để so sánh tình hình kinh doanh của các tỉnh thành, của các khu vực. Vì vậy ta sẽ xem nó như thuộc tính kết hợp và tách làm 3 phần, địa chỉ trong tỉnh hay thành phố, tỉnh thành phố, và khu vực.

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.


Chuyển hóa các liên kết bậc 2

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:

  • Quan hệ KetHop_NCU_NL gồm hai thuộc tính lấy từ khóa chính của NHA_CUNG_UNG và NGUYEN_LIEU, và hai thuộc tính này cũng tạo thành khóa chính của quan hệ KetHop_NCU_NL. Vậy quan hệ này được định nghĩa như sau:

    KetHop_NCU_NL (MaSo_NCU, MaSo_NL).

  • Quan hệ KetHop_NL_SP gồm hai thuộc tính lấy từ khóa chính của NGUYEN_LIEU và SAN_PHAM, và hai thuộc tính này cũng tạo thành khóa chính của quan hệ KetHop_NL_SP. Vậy quan hệ này được định nghĩa như sau:

    KetHop_NL_SP (MaSo_NL, MaSo_SP).

  • Quan hệ KetHop_KH_SP gồm hai thuộc tính lấy từ khóa chính của KHACH_HANG và SAN_PHAM, và hai thuộc tính này cũng tạo thành khóa chính của quan hệ KetHop_KH_SP. Vậy quan hệ này được định nghĩa như sau:

    KetHop_KH_SP (MaSo_KH, MaSo_SP).


Mô hình quan hệ

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.

Bảng 1 Các quan hệ và thuộc tính của cơ sở dữ liệu trong thí dụ
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 trướcVề đầu chươngTrang sau


Trang web này được cập nhật lần cuối ngày 25/11/2018