Xét 3 bảng s, t1, t2 lần lượt có các cột X, Y1, Y2 sao cho s[] t1 [1] và s[]t2 [2]. Trong đó , X và không rỗng (non-nullable), 1 t1,
2 2 t
. Nếu áp dụng quy tắc ánh xạ trong trường hợp một khóa ngoại cho hai bảng như phần 2.2.3.1 cho từng nhóm một thì chúng sẽ kết nối với nhau tuỳ thuộc vào tính duy nhất hay không duy nhất của ,: (1) M(t1) = {Y1, s? }, hoặc M(t1) {Y1, s*}; (2) M(t2) = {Y2, s? }, hoặc M(t2) = {Y2, s* }.
Ta nhận thấy, sự chuyển động ở trên là dư thừa, theo lý thuyết CSDL gọi là cập nhật dự thường đối với s. Để tránh sự di thường này thì một trong hai ràng buộc khoá ngoại phải sử dụng phụ thuộc bao hàm (INDs0 hoặc thuộc tính IDREF. Ví dụ, giả sử dàng buộc khoá ngoại đầu tiên là s[] t1[1] được biểu thị như sau: M(t1) {Y1, s*} và M(s)= {X-}, thì ràng buộc khoá ngoại thứ hai là s[]t2[2] có thể được biểu diễn bằng thuộc tính IDREF như sau:
A(t2) = {ID_t2) P(ID_t2) = (ID, ,,) A(s) = {Ref_t2) } P(Ref_t2) = IDREF, , ,) M(t2) = (Y2) M(s) = (X-)
Chẳng hạn biểu diễn khoá cũ và khoá mới của s tương ứng là ks và ks' thì ks' được xác định như sau:
1) Nếu ks = thì ks' = ks
2) Nếu ks thì ks' = (ks - )Ref_t2
Ví dụ 2.15: Xét lại hai quan hệ SinhVien(tenSV, gioiTinh, nguuoiHD, khoaHoc và GiaoVien(tenGV, tuoi). Ta xét thêm quan hệ thứ ba là
Loop(tenLop, phong) có khoá ngoại là SinhVien[khoaHoc]Lop[tenLop].
Áp dụng quy tắc trên, lược đồ được ánh xạ sang lược đồ XML như sau:
<!ELEMENT GiaoVien (tenGV, tuoi, SinhVien*)>
<!ELEMENT SinhVien(ten SV, gioiTinh)>
<!ATTLIST SinhVien Ref_Lop IDREF>
<!ELEMENT Lop (tenLop, phong)>
<!ATTLIST Lop ID_Lop ID>
Ta thấy có hai thuộc tính mới được thêm vào là Ref_Lop kiểu IDREF và
ID_Lop kiểu ID. Lúc này, khoá mới của SinhVien là {tenSV, Ref_Lopkey
SinhVien}nhưng ràng buộc này không mô tả được trong DTD.