Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Tạo một bảng / chế độ xem phẳng của một tập hợp dữ liệu được xác định theo thứ bậc

Vì vậy, những gì bạn muốn là hiện thực hóa các quá trình đóng bắc cầu. Đó là, với bảng ứng dụng này ...

 ID   | PARENT_ID
------+----------
    1 | 
    2 |         1
    3 |         2
    4 |         2
    5 |         4

... bảng biểu đồ sẽ giống như sau:

 PARENT_ID | CHILD_ID
-----------+----------
         1 |        2
         1 |        3
         1 |        4
         1 |        5
         2 |        3
         2 |        4
         2 |        5
         4 |        5

Có thể duy trì một bảng như thế này trong Oracle, mặc dù bạn sẽ cần phải triển khai khuôn khổ của riêng mình cho nó. Câu hỏi đặt ra là liệu nó có xứng đáng với chi phí đầu tư hay không. Nếu bảng nguồn dễ bay hơi thì việc giữ nguyên dữ liệu biểu đồ có thể tốn nhiều chu kỳ hơn bạn sẽ tiết kiệm cho các truy vấn. Chỉ bạn mới biết hồ sơ dữ liệu của mình.

Tôi không nghĩ rằng bạn có thể duy trì một bảng đồ thị như vậy với các truy vấn CONNECT BY và các khóa ngoại xếp tầng. Quá nhiều hoạt động gián tiếp, quá khó để làm đúng. Ngoài ra, chế độ xem cụ thể hóa cũng bị loại bỏ bởi vì chúng tôi không thể viết một truy vấn SQL sẽ tóm tắt 1->5 ghi lại khi chúng tôi xóa bản ghi nguồn cho ID=4 .

Vì vậy, những gì tôi đề nghị bạn nên đọc một bài báo có tên là Duy trì sự khép kín của đồ thị trong SQL của Dong, Libkin, Su và Wong. Điều này chứa rất nhiều lý thuyết và một số SQL phức tạp (Oracle) nhưng nó sẽ cung cấp cho bạn nền tảng để xây dựng PL / SQL mà bạn cần để duy trì một bảng đồ thị.

"bạn có thể mở rộng thêm phần về việc quá khó để duy trì với CONNECT BY / xếp tầng FK không? Nếu tôi kiểm soát quyền truy cập vào bảng và tất cả các quy trình bổ sung / cập nhật / xóa diễn ra tồi tệ, thì điều này sẽ xảy ra với những loại kịch bản nào?">

Xem xét bản ghi 1->5 là ngắn mạch của 1->2->4->5 . Bây giờ điều gì sẽ xảy ra nếu, như tôi đã nói trước đây, chúng tôi xóa bản ghi nguồn cho ID=4 ? Việc xếp chồng các khóa ngoại có thể xóa các mục nhập cho 2->44->5 . Nhưng điều đó để lại 1->5 (và thực sự là 2->5 ) trong bảng biểu đồ mặc dù chúng không còn đại diện cho một cạnh hợp lệ trong biểu đồ .

Điều có thể hoạt động (tôi nghĩ là tôi chưa làm) sẽ là sử dụng một khóa tổng hợp bổ sung trong bảng nguồn, như thế này.

 ID   | PARENT_ID | NEW_KEY
------+-----------+---------
    1 |           | AAA
    2 |         1 | BBB
    3 |         2 | CCC
    4 |         2 | DDD
    5 |         4 | EEE

Bây giờ bảng biểu đồ sẽ giống như sau:

 PARENT_ID | CHILD_ID | NEW_KEY
-----------+----------+---------
         1 |        2 | BBB
         1 |        3 | CCC
         1 |        4 | DDD
         1 |        5 | DDD
         2 |        3 | CCC
         2 |        4 | DDD
         2 |        5 | DDD
         4 |        5 | DDD

Vì vậy, bảng biểu đồ có một khóa ngoại tham chiếu đến mối quan hệ trong bảng nguồn đã tạo ra nó, thay vì liên kết với ID. Sau đó, xóa bản ghi cho ID=4 sẽ xóa theo tầng của tất cả các bản ghi trong bảng biểu đồ nơi NEW_KEY=DDD .

Điều này sẽ hoạt động nếu bất kỳ ID nhất định nào chỉ có thể có 0 hoặc một ID mẹ. Nhưng nó sẽ không hoạt động nếu điều này được phép xảy ra:

ID
 ID   | PARENT_ID
------+----------
    5 |         2
    5 |         4

Nói cách khác, cạnh 1->5 đại diện cho cả 1->2->4->51->2->5 . Vì vậy, những gì có thể hoạt động phụ thuộc vào độ phức tạp của dữ liệu của bạn.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQLFiddle có bị hỏng không? Lỗi đối với Oracle, SQL Server, ...?

  2. Xuất Bảng Oracle sang Trang tính Excel

  3. Xóa bằng kết nối trái trong Oracle 10g

  4. THÊM trên SearchOracle.com

  5. Cách định dạng một số dưới dạng tiền tệ trong Oracle