2009-08-07 33 views
5

Tôi đang cố gắng triển khai cấu trúc giống cây bằng mô hình Đường dẫn vật chất được mô tả tại đây: http://www.dbazine.com/oracle/or-articles/tropashko4.Thực thi Tính Toàn vẹn Tham chiếu trên Đường dẫn Vật chất?

Có thể thực thi tính toàn vẹn tham chiếu trên trường [đường dẫn] không? Tôi không thấy làm thế nào SQL có thể làm điều đó, tôi có phải làm điều đó bằng tay trong DAL?

Trả lời

3

Có, bạn phải tự thi hành toàn vẹn dữ liệu trong DAL khi bạn sử dụng giải pháp Materialized Path hoặc Nested Sets cho dữ liệu phân cấp.

Danh sách Adjacency hỗ trợ tính toàn vẹn tham chiếu và điều này cũng đúng đối với thiết kế tôi gọi là "Closure Table" (Tropashko gọi thiết kế này là "mối quan hệ đóng cửa chuyển tiếp").

+0

Cảm ơn thông tin, Bill. – hyperslug

+0

Đây là bài viết về giải pháp đóng cửa chuyển tiếp: http://www.codeproject.com/KB/database/Modeling_DAGs_on_SQL_DBs.aspx @Bill Karwin: các tập dữ liệu lớn mà bạn đã triển khai bằng cách sử dụng "bảng đóng" trong OLTP/kịch bản tương tác mà không đạt hiệu suất vấn đề cho chèn? – nawroth

+0

@nawroth: Chỉ theo thứ tự của hàng ngàn nút trong cây, vì vậy điểm tốt. Nếu bạn cần đại diện cho những cây rất sâu, bạn sẽ có rất nhiều hàng. Nếu bạn cần phải đại diện cho nhiều cây nông, nó khiêm tốn hơn. –

1

Trong mô hình đường dẫn vật hoá, bạn có thể sử dụng chuỗi tùy ý (có thể chuỗi unicode để cho phép hơn 256 trẻ em) thay vì chuỗi đặc biệt có dạng "x.y.z". Id của cha mẹ sau đó là id của trẻ em trực tiếp có ký tự cuối cùng bị xóa. Bạn có thể dễ dàng thực thi điều này với ràng buộc kiểm tra như (ví dụ của tôi hoạt động trong PostgreSQL)

check(parent_id = substring(id from 1 for char_length(id)-1)), 

trong lệnh tạo bảng của bạn. Nếu bạn nhấn mạnh vào các chuỗi có dạng "x.y.z", bạn sẽ phải chơi xung quanh với các cụm từ thông dụng, nhưng tôi đoán có thể tìm thấy ràng buộc kiểm tra tương ứng.

+0

Nếu bạn muốn thực thi các gốc có char_length (id) = 1, bạn có thể thêm kiểm tra ràng buộc ((parent_id là null) hoặc (char_length (id) = 1)) vào định nghĩa bảng. – Whoever

3

"Đường dẫn vật liệu hóa" như được trình bày bởi Vadim Tropashko trong bài viết đó, giới thiệu khái niệm thứ tự thành quan hệ ("Jones là thành viên thứ hai".).

"Đường dẫn vật chất" không là gì ngoài "một dạng xem vật chất" trên đóng cửa chuyển tiếp và do đó gặp phải tất cả và chính xác cùng một vấn đề như bất kỳ "chế độ xem vật hoá" khác, ngoại trừ các vấn đề về mặt thuật toán kém chính xác hơn vì tham gia đóng cửa.

SQL gần như hoàn toàn bất lực khi các ràng buộc-trên-một-đóng đang được phát. (Có nghĩa là: vâng, SQL yêu cầu bạn tự làm mọi thứ.) Đó là một trong những lĩnh vực mà RM cho thấy sức mạnh gần như không giới hạn của nó, nhưng SQL không thành công, và nơi nó là một sự xấu hổ mà đa số mọi người nhầm lẫn với SQL vì có quan hệ.

(@Bill Karwin: Tôi muốn có thể cung cấp cho bạn +1 nhận xét của bạn về mối quan hệ giữa độ sâu của cây và kết quả về hiệu suất. Không có thuật toán nào để tính toán các bao đóng hoạt động tốt trong trường hợp cây với độ sâu "điên". Đây là một vấn đề thuật toán, không phải là một SQL cũng không phải là một quan hệ.)

EDIT

Vâng, RM = Relational Model

+0

RM = mô hình quan hệ? – hyperslug

+1

+1 Có, con đường vật chất là một ví dụ về sự không chuẩn hóa. Nó có một số lợi ích về hiệu quả đối với một số loại truy vấn nhất định, nhưng nó hy sinh lợi ích của RM như tính toàn vẹn tham chiếu. –

+0

Btw, bạn có thể di chuột qua mũi tên lên trên vô hình ở bên trái nhận xét và đưa ra nhận xét một chút xác nhận. Tuy nhiên, điều đó không cho điểm đại diện. –

Các vấn đề liên quan