Bài giảng Cơ sở dữ liệu - Chương 5: Xác định khóa - Đỗ Thị Kim Thành

 Xác định khóa chính của các quan hệ  Xác định khóa ngoại của các quan hệ  Vẽ lược đồ CSDL (Diagram)

pdf53 trang | Chia sẻ: candy98 | Lượt xem: 763 | Lượt tải: 0download
Bạn đang xem trước 20 trang tài liệu Bài giảng Cơ sở dữ liệu - Chương 5: Xác định khóa - Đỗ Thị Kim Thành, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
Nguyễn Hà Giang - 2008 1 Tree Structure ThS. Nguyễn Hà Giang Hutech - FIT Nguyễn Hà Giang - 2008 2 Nội dung  Cấu trúc cây  Cây nhị phân  Cây nhị phân tìm kiếm  Cây nhị phân tìm kiếm cân bằng AVL  Phần mở rộng (cây đa phân)  Cây Top-Down  B-Tree Nguyễn Hà Giang - 2008 3 Phần mở rộng Cây đa phân Top-down, B-Tree Nguyễn Hà Giang - 2008 4 Phần mở rộng  Cây đa phân/cây đa nhánh  Có 1 nút là nút gốc  Mỗi nút có thể có n nút con  Cây đa phân tìm kiếm  Mỗi nút trên cây đa phân tìm kiếm có nhiều khoá và nhiều nhánh con  Số khoá ít hơn nhánh con là 1  VD: có 3 khoá thì sẽ có 4 nhánh con Nguyễn Hà Giang - 2008 5 Phần mở rộng  Cây đa phân tìm kiếm k1 kn-1 Cây con S1 Cây con S2 Cây con Sn k2 Cấu trúc của một nút Nguyễn Hà Giang - 2008 6 Cây đa phân tìm kiếm  Định nghĩa cây đa phân tìm kiếm  Tại mỗi nút phải thoả điều kiện  Tất cả khoá trên nhánh s1 nhỏ hơn hay bằng k1  Tất cả khóa trên nhánh cây con si (1≤ i ≤n-1) đều lớn hơn khoá ki-1 và nhỏ hơn hay bằng ki  Tất cả khóa trên nhánh cây con sn đều lớn hơn khóa kn-1  Cây nhị phân tìm kiếm là cây đa phân tìm kiếm có bậc là 2! Nguyễn Hà Giang - 2008 7 Cây đa phân tìm kiếm 120 150 180 k ≤ 120 120 < k ≤ 150 150 < k ≤ 180 k > 180 Nút cha Nguyễn Hà Giang - 2008 8 Cây đa phân tìm kiếm  Cây đa phân tìm kiếm bậc 3/cây tam phân tìm kiếm 50 100 10 30 60 150 200 15 204 40 120 130 160 210 >100≤ 50 Nguyễn Hà Giang - 2008 9 Cây đa phân tìm kiếm  Cây đa phân tìm kiếm thông dụng  Cây top-down  B-tree  Cây top-down  Là cây đa phân tìm kiếm  Tất cả các nút ko đủ (hay ko đầy) đều là nút lá! Nguyễn Hà Giang - 2008 10 Cây Top-Down  Cây Top-down bậc 3 50 100 10 30 60 150 200 15 204 40 120 130 160 210 Nút không đầy phải là nút lá Nguyễn Hà Giang - 2008 11 Cây Top-Down  Cây Top-Down ? 50 100 10 30 60 150 200 15 204 40 120 130 160 21055 88 Nguyễn Hà Giang - 2008 12 Cây Top-Down  Thêm phần tử vào cây Top-Down  Xác định nút lá phù hợp để chèn khóa  Nếu nút không đầy:  Chèn khóa vào vị trí thích hợp  Nếu nút đầy:  Cấp phát nút lá mới chứa khoá cần chèn  Nút mới này là con của nút cũ. Nguyễn Hà Giang - 2008 13 Cây Top-Down  Chèn 18 vào cây? 50 100 10 30 60 150 200 15 204 40 120 130 160 210 Nguyễn Hà Giang - 2008 14 Cây Top-Down  Chèn 18 vào cây 50 100 10 30 60 150 200 15 204 40 120 130 160 210 18 Nguyễn Hà Giang - 2008 15 Cây Top-Down  Chèn 75 vào cây? 50 100 10 30 60 150 200 15 204 40 120 130 160 210 18 Nguyễn Hà Giang - 2008 16 Cây Top-Down  Chèn 75 vào cây 50 100 10 30 60 75 150 200 15 204 40 120 130 160 210 18 Chèn vào danh sách khoá Nút bây giờ đã đầy Nguyễn Hà Giang - 2008 17 Cây Top-Down  Mô tả cấu trúc dữ liệu cho cây Top-down  Gọi ORDER là bậc của cây top-down  Với mỗi nút p trên cây  NumTrees là số nhánh cây con nút p: nút sẽ có NumTrees-1 khoá!  Mảng Key chứa khoá của nút  Mảng con trỏ Son trỏ đến các nhánh con Nguyễn Hà Giang - 2008 18 Cây Top-Down  Khai báo cấu trúc nút cho cây Top-Down #define ORDER typedef struct node { int NumTrees; DataType Key[ORDER-1]; struct node * Son[ORDER]; } NODE; typedef NODE * NodePtr; NodePtr pTopDownTree; Nguyễn Hà Giang - 2008 19 Cây Top-Down  Các thao tác  CreateNode: cấp phát một nút mới có khoá k, và khởi tạo danh sách các cây con trỏ đến NULL  SearchNode: Trả về vị trí nhỏ nhất của khoá trong nút p lớn hơn hay bằng k  Search: duyệt từ gốc, đi xuống các nút thích hợp để kiểm tra xem khóa k có trong nút nào đó trên cây hay không  ShowTree: duyệt cây  Insert: chèn một khoá vào cây Nguyễn Hà Giang - 2008 20 Cây Top-Down  CreateNode: tạo nút mới cho cây NodePtr CreateNode(int k){ NodePtr p; p = NewNode(); p->NumTrees=2; //có 2 nhánh cây con p->Key[0]=k; //nút mới chưa có nút con for(int i=0; i < ORDER; i++) p->Son[i]=NULL; return p; } Nguyễn Hà Giang - 2008 21 Cây Top-Down  SearchNode:  Trả về vị trí nhỏ nhất của khoá trong nút p bắt đầu lớn hơn hay bằng k.  Trường hợp k lớn hơn tất cả các khoá trong nút p thì trả về vị trí p->NumTrees – 1 int SearchNode(NodePtr p, int k){ int i = 0; while ( iNumTrees-1 && p->Key[i] <k) i++; return i; } Nguyễn Hà Giang - 2008 22 Cây Top-Down  NodePtr Search(NodePtr Tree, int k, int &pos, int &found)  Trường hợp tìm thấy  found = true  Hàm trả về địa chỉ của nút chứa khoá k  Pos là vị trí của k trong nút p  Không tìm thấy  found = false  Hàm trả về vị trí con trỏ của nút lá có thể thêm k vào  Biến pos trả về vị trí có thể chèn khoá k vào nút lá q Nguyễn Hà Giang - 2008 23 Cây Top-Down NodePtr search(NodePtr pTree, int k, int &pos, int &found){ int i; NodePtr p,q; q = NULL; p = pTree; while(p != NULL){ i = SearchNode(p, k); if(i NumTrees-1 && k==p->Key[i]) {//found found = TRUE; pos = i; return p; } q = p; p = p->Son[i]; // xuống cây con thứ i } found = FALSE; pos = i; return q; } Nguyễn Hà Giang - 2008 24 Cây Top-Down  ShowTree: duyệt cây  Duyệt theo thứ tự xen kẻ: cây con và khoá void ShowTree(NodePtr pTree){ int i, nt; if(pTree ==NULL) return; else{ nt = pTree->NumTrees; for(i=0; i< nt-1; i++){ ShowTree(pTree->Son[i]); printf("%8d", pTree->Key[i]); } ShowTree(pTree->Son[nt-1]); } } Nguyễn Hà Giang - 2008 25 Cây Top-Down  InsertLeaf: chèn 1 khoá vào nút lá chưa đầy void InsertLeaf(NodePtr p, int k, int pos){ int i, nt; nt=p->NumTrees; p->NumTrees=nt+1; for(i=nt-1;i>pos ;i--){ p->Key[i]= p->Key[i-1]; } p->Key[pos] = k; } Nguyễn Hà Giang - 2008 26 Cây Top-Down  Insert: chèn 1 khóa vào cây Top-Down  Nếu cây rỗng: tạo nút mới là gốc của cây  Nếu cây đã chứa khóa thì thoát  Trường hợp chưa chứa khoá  Xác định nút thích hợp để chèn vào  Nút đã đầy thì tạo nút con mới chứa khoá cần thêm  Nếu nút chưa đầy, chèn khóa vào danh sách khoá của nút Nguyễn Hà Giang - 2008 27 Cây Top-Down NodePtr Insert(NodePtr pTree, int k){ NodePtr s, p; int position,found; if(ptree==NULL){ // cây rỗng tạo nút gốc của cây ptree=CreateNode(k); return ptree; } s=Search(pTree, k, position, found); if(found==TRUE){ printf("\n Khoa da ton tai"); return s; } if(s->NumTrees<ORDER){ // chèn vào danh sách khoá InsertLeaf(s, k, position); return s; } p=CreateNode(k); // tạo nút mới s->Son[position] = p; // nút mới trở thành nút con của s return p; } Nguyễn Hà Giang - 2008 28 Nguyễn Hà Giang - 2008 29 B-Tree  Cây B-Tree bậc m là cây đa phân tìm kiếm thoả  Tất cả nút lá có cùng một mức  Tất cả các nút trên cây trừ nút gốc có ít nhất (m-1)/2 khoá  Đặc điểm  B-Tree là cây cân bằng và chiều sâu của cây nhỏ nên việc tìm kiếm B-Tree được thực hiện nhanh!  Vì tất cả các nút đều đầy hơn một nửa do đó tối ưu  Dùng B-Tree để truy xuất dữ liệu lưu ở bộ nhớ ngoài Nguyễn Hà Giang - 2008 30 B-Tree  Tác giả là Rudolf Bayer và Ed McCreight  Chữ B có thể viết tắt:  Balance: do tất cả nút lá cùng mức  Bayer: tên tác giả  Branching Tree  Boeing: do các tác giả làm việc Boeing Scientific Research Labs Nguyễn Hà Giang - 2008 31 B-Tree  Minh họa B-Tree bậc 5 50 10 30 150 200 15 17 202 3 4 8 40 44 60 70 130 160 180 210 250 Có tối thiểu 2 khoá Trừ nút gốc Nguyễn Hà Giang - 2008 32 B-Tree  Thao tác chèn khoá x vào cây  Xác định vị nút lá thích hợp để chèn khoá mới vào nút lá này.  Nếu nút lá chưa đầy: thêm khoá mới vào  Nếu nút lá đầy: đã tồn tại ORDER-1 khoá và ORDER nhánh con.  Giả sử ta thêm khoá x vào nút lá này khi đó nút sẽ có ORDER khóa  Thực hiện tách nút này thành hai nút bằng nhau như sau:  Nút nửa trái nLeft gồm các khoá nhỏ từ vị trí 0 đến midkey-1  Nút nửa phải nRight gồm các khoá lớn từ midkey+1 đến ORDER  Khoá MidKey và nút con nRight được chèn vào nút cha. Quá trình xử lý tương tự với nút MidKey và các khoá trong nRight khi chèn vào nút cha. Nguyễn Hà Giang - 2008 33 B-Tree  Chèn khoá 45 vào cây 50 10 30 150 200 15 17 202 3 4 8 40 44 60 70 130 160 180 210 250 Nguyễn Hà Giang - 2008 34 B-Tree  Chèn khoá 45 vào cây 50 10 30 150 200 15 17 202 3 4 8 40 44 45 60 70 130 160 180 210 250 Chèn 45 vào nút {40,44} chưa đầy Chèn bình thường, bổ sung vào vị trí Thích hợp trong danh sách khoá Nguyễn Hà Giang - 2008 35 B-Tree  Chèn khoá 5 vào cây 50 10 30 150 200 15 17 202 3 4 8 40 44 45 60 70 130 160 180 210 250 Nguyễn Hà Giang - 2008 36 B-Tree  Chèn khoá 5 vào cây 50 10 30 150 200 15 17 202 3 4 5 8 40 44 45 60 70 130 160 180 210 250 Phải tách nút: MidKey là 4, nLeft ={2 3}, nRight = {5 8} Nguyễn Hà Giang - 2008 37 B-Tree  Chèn khoá 5 vào cây 50 10 30 150 200 15 17 202 3 40 44 45 60 70 130 160 180 210 250 4 5 8 Đưa nhóm nút này lên nút {10 30} Nguyễn Hà Giang - 2008 38 B-Tree  Chèn khoá 5 vào cây 50 4 10 30 150 200 15 17 202 3 40 44 45 60 70 130 160 180 210 250 5 8 Đưa nhóm nút {5 8} này lên nút {10 30} Nguyễn Hà Giang - 2008 39 B-Tree  Chèn khoá 5 vào cây 50 4 10 30 150 200 15 17 202 3 40 44 45 60 70 130 160 180 210 2505 8 {5 8} trở thành cây con thứ 2 của nút {4 10 30} Nguyễn Hà Giang - 2008 40 B-Tree  Chèn khoá 41 vào cây 50 4 10 30 150 200 15 17 202 3 40 44 45 60 70 130 160 180 210 2505 8 Nguyễn Hà Giang - 2008 41 B-Tree  Chèn khoá 41 vào cây 50 4 10 30 150 200 15 17 202 3 40 41 44 45 60 70 130 160 180 210 2505 8 Nguyễn Hà Giang - 2008 42 B-Tree  Chèn khoá 43 vào cây 50 4 10 30 150 200 15 17 202 3 40 41 44 45 60 70 130 160 180 210 2505 8 Nguyễn Hà Giang - 2008 43 B-Tree  Chèn khoá 43 vào cây 50 4 10 30 150 200 15 17 202 3 40 41 43 44 45 60 70 130 160 180 210 2505 8 Tách nút Nguyễn Hà Giang - 2008 44 B-Tree  Chèn khoá 43 vào cây 50 4 10 30 43 150 200 15 17 202 3 40 41 60 70 130 160 180 210 2505 8 44 45 Nguyễn Hà Giang - 2008 45 B-Tree  Chèn khoá 46, 48 vào cây 50 4 10 30 43 150 200 15 17 202 3 40 41 60 70 130 160 180 210 2505 8 44 45 Nguyễn Hà Giang - 2008 46 B-Tree  Chèn khoá 46, 48 vào cây 50 4 10 30 43 150 200 15 17 202 3 40 41 60 70 130 160 180 210 2505 8 44 45 46 48 Nguyễn Hà Giang - 2008 47 B-Tree  Chèn khoá 47 vào cây 50 4 10 30 43 150 200 15 17 202 3 40 41 60 70 130 160 180 210 2505 8 44 45 46 47 48 Chia nút Nguyễn Hà Giang - 2008 48 B-Tree  Chèn khoá 47 vào cây 50 4 10 30 43 46 150 200 15 17 202 3 40 41 60 70 130 160 180 210 2505 8 44 45 47 48 Chia nút Nguyễn Hà Giang - 2008 49 B-Tree  Chèn khoá 47 vào cây 30 50 4 10 150 200 15 17 202 3 40 41 60 70 130 160 180 210 2505 8 44 45 47 48 43 46 Nguyễn Hà Giang - 2008 50 B-Tree  Nhận xét về cân bằng:  B-Tree: upward split  BST: downward split  B-Tree  Tốt cho việc: exact match search  Không tốt: range search  cải tiến với B+-Tree  Ứng dụng  Tổ chức dữ liệu lưu bộ nhớ ngoài khi dữ liệu quá lớn  Ổn định, truy xuất nhanh với số lần truy xuất thấp Nguyễn Hà Giang - 2008 51 B-Tree  Các loại B-Tree cải tiến để tối ưu bộ nhớ  B*-Tree bậc m  Là B-Tree bậc m, tất cả nút trừ gốc đầy hơn 2/3  Hiệu suất dùng bộ nhớ là hơn 67%  Compact B*-Tree  Tất cả nút đều đầy (ngoại trừ một số nút lá ở cuối)  Ít dùng vì giải thuật thêm khoá vào cây phức tạp, chi phí chuyển cây về compact Btree rất lớn Nguyễn Hà Giang - 2008 52 B-Tree  B+-Tree  Tất cả khóa có mặt ở nút lá  Các nút lá được liên kết với nhau từ trái sang phải dạng DSLK 41 15 22 32 49 58 4 12 15 18 22 25 27 30 32 35 38 41 45 49 51 55 58 60 63 Các khoá đều nằm ở nút lá Nguyễn Hà Giang - 2008 53 Đọc thêm  Tài liệu tham khảo    html  ree.html