Do các mệnh đề phân mảnh ngang được lưu lại trong Y tương ứng với các mảnh trong F (xem thuật toán PhanMN mục 2.2.2.) mà phân mảnh hỗn hợp là phân mảnh ngang sau đó phân mảnh dọc hoặc ngược lại. Ở đây thuộc vào trường hợp dầu tiên.
Với mỗi mảnh ngang Mkp thuộc F ta tiến hành quá trình phân mảnh dọc. Với tập thuộc tính A của quan hệ, ta tiến hành:
Xét tập các ràng buộc điều kiện của quá trình phân mảnh (ví dụ: thuộc tính có chiều dài lớn nhất, thuộc tính có dữ liệu kiểu văn bản, …)
Xác định thuộc tính chứa giá trị lặp Aj
Phân mảnh dọc tập thuộc tính A của quan hệ (không tính thuộc tính chứa giá trị lặp).
Xác định mảnh có kích thước lớn nhất trong tập các mảnh thu được. Gán nhãn cho mảnh thu được.
Thuật toán phân mảnh hỗn hợp PhanHH được thực hiện như sau:
Thuật toán PhanHH
Dạng tổng quát
Trường hợp khi phân mảnh kết hợp cả phân mảnh ngang và phân mảnh dọc thì quá trình phân mảnh được gọi là phân mảnh hỗn hợp. Phân mảnh hỗn hợp thường được thực hiện theo trình tự phân mảnh ngang trước sau đó phân mảnh dọc hoặc ngược lại [1]. Có thể coi việc phân mảnh hỗn hợp tương ứng với các câu lệnh SQL như sau:
SELECT * FROM R
WHERE <Mệnh đề hội sơ cấp>
Mảnh thu được là tập các bộ được tách ra qua việc thực hiện câu SQL ở trên chính là mảnh ngang. Ký hiệu mảnh ngang thu được là H. Bây giờ thực hiện phân mảnh dọc từ các mảnh ngang đã có, dùng câu lệnh SQL như sau:
SELECT <Tìm thuộc tính không khóa của H> FROM H
WHERE True
Ký hiệu mảnh dọc thu được do câu lệnh trên là VH, và tập khoá của H là KeyH. Mảnh hỗn hợp thu được có dạng KeyH VH và được ký hiệu là HV
Thủ tục phân mảnh hỗn hợp
Input: R
Output: F /*Các mảnh HH có card > 1 Vì các mảnh ngang đã có card >1*/; PhanmanhHH
Begin
/* Sau thủ tục này chúng ta nhận được các mảnh M“pi, k1 pi, k2 ... pi, kq” mà các Index đầu của mỗi mệnh đề là số thứ tự của trường*/
FHH = /* F tập các mảnh hh */ Khai báo biến s: string
/* Lấy các mệnh đề từ kết quả của thuật toán phân mảnh ngang PhanMN */ For Each s In Y
Sb = các chỉ số đầu tiên của s Select Sb Into TAM
From Ms
FHH = FHH TAM