2011-07-13 39 views
7

Tôi muốn lưu trữ xml mà tôi nhận được trong dịch vụ web java của mình. Báo cáo sẽ chạy 5 phút một lần để lấy một số dữ liệu trong các phần tử xml.Lưu trữ dữ liệu XML trong cơ sở dữ liệu - nhiều bảng so với bán phá giá xml trong cột

Tôi đã nghĩ đến hai phương pháp để giải quyết vấn đề này.

  1. Tạo nhiều bảng trong cơ sở dữ liệu để nắm bắt dữ liệu xml. Về cơ bản, mỗi phần tử sẽ có cột riêng trong cơ sở dữ liệu.

  2. Dump toàn bộ xml trong cột có thể lưu trữ dữ liệu xml. Vì mục đích báo cáo phân tích cú pháp giá trị trong chính truy vấn đó.

Cách tiếp cận nào ở trên tốt hơn, đặc biệt về hiệu suất? Điều này là rất quan trọng vì các báo cáo sẽ được tạo ra ở tần số rất cao (cứ 5 phút một lần).

Lược đồ xml khá phức tạp và không đơn giản.

Trả lời

8

Nếu dữ liệu sẽ được viết một lần và truy vấn nhiều lần, sẽ gần như hiệu quả hơn để phân tích cú pháp tài liệu XML một lần, lưu trữ dữ liệu trong một lược đồ quan hệ thích hợp và truy vấn lược đồ quan hệ. Phân tích cú pháp XML không phải là giá rẻ nên chi phí phân tích cú pháp có khả năng nhiều tài liệu XML mỗi 5 phút có thể là đáng kể.

Tất nhiên, cũng như tất cả các câu hỏi về hiệu suất, số dặm của bạn có thể thay đổi để có thể đáng thử nghiệm. Nếu bạn đang sử dụng Oracle 11.2 và bạn lưu trữ dữ liệu dưới dạng XML nhị phân (trong trường hợp nó được lưu trữ sau khi được phân tích cú pháp) và bạn tạo XMLIndexes thích hợp trên các XMLTypes bạn đang lưu trữ, hình phạt hiệu suất để rời khỏi dữ liệu trong tài liệu XML có thể là khá nhỏ. Nó vẫn phải chậm hơn một cấu trúc quan hệ thích hợp nhưng sự khác biệt có thể không có ý nghĩa đối với bạn.

Cá nhân, tôi thích phương pháp lưu trữ quan hệ nói chung thậm chí bỏ qua các vấn đề hiệu suất vì nó giúp người khác tương tác với dữ liệu dễ dàng hơn.Có nhiều nhà phát triển hơn có thể viết SQL phong nha hơn có thể viết biểu thức XPath phong nha và có nhiều công cụ truy vấn hơn có thể tạo báo cáo từ các bảng quan hệ hơn là có thể tạo báo cáo tắt XML được lưu trữ trong cơ sở dữ liệu.

4

Adhoc Truy cập

Nếu bạn cần chạy các truy vấn efficent trên các dữ liệu chứa trong XML trong một Adhoc hoặc cách tùy ý bạn nên phân tích nó ra TablesColumns rằng logic có thể chỉ mục và tham gia vào.

TNHH Truy cập

Nếu bạn chỉ lưu trữ các dữ liệu, và cung cấp nó dựa trên một số tiêu chí khác như một id duy nhất hoặc quan trọng khác, và XML về cơ bản là một đục BLOB sau đó chỉ cần lưu nó trong một cột BLOB và được thực hiện với nó.

hybrid Mẫu

một cái gì đó ở giữa, nơi XML được lưu trữ trong Những gì bạn có thể sẽ cần là một BLOB và chỉ bit có liên quan được lưu trữ trong TablesColumns vì vậy bạn có thể tìm kiếm payload XML một cách hiệu quả.

+0

Mô hình lai: Bạn có nghĩa là các yếu tố cửa hàng thường xuyên được truy vấn trong các bảng và lưu trữ xml dưới dạng blob không? Nếu yêu cầu các yếu tố khác có thể được truy vấn từ xml. – Maximus

5

Maximus, Nó thực sự phụ thuộc vào những gì bạn muốn làm với dữ liệu XML.

Khi tôi sử dụng XML cho mục đích kiểm soát, chẳng hạn như định cấu hình cách trang hiển thị, tôi sẽ lưu toàn bộ XML vào một trường BLOB duy nhất. Nó rất nhanh và cực kỳ đơn giản. Đó là một thói quen lưu và tải đơn giản. Bạn có thể dễ dàng xem XML trong trường BLOB và chỉnh sửa nó.

Nếu bạn cần tìm kiếm hoặc báo cáo về giá trị bên trong XML, chẳng hạn như số lượng khách hàng có thuộc tính cụ thể, bạn có thể muốn phân tích cú pháp thành các thuộc tính riêng lẻ. Điều này thường có nghĩa là bạn sẽ phải thực hiện một số xử lý trước và sau, nhưng cho phép bạn nhanh chóng truy cập các thuộc tính riêng lẻ.

1

Không biết nhiều hơn nữa, thật khó để nói chắc chắn, nhưng rất có thể bạn đang thiếu một phần quan trọng có thể đơn giản hóa cuộc sống rất nhiều.

  1. Bind từ XML để POJO (JAXB, MOXY hoặc JibX)
  2. Store cột bình thường từ POJO (sử dụng jDBI, Hibernate, hoặc thậm chí các mẫu JDBC đơn giản)

Ngoài ra, tùy thuộc vào chính xác bạn có thể xem xét khả năng giữ dữ liệu trong bộ nhớ - cứ 5 phút không có vẻ như hiệu suất quan trọng, nhưng sau đó một lần nữa kiên trì không phải lúc nào cũng cần thiết (hoặc chỉ là dữ liệu lịch sử hoặc sao lưu).

1

Nếu bạn cần phải giữ và truy vấn nhiều hơn một vài tài liệu xml bạn nên sử dụng một cơ sở dữ liệu XML ..

eXist là tốt đẹp, giữ những XMLs trong một cột hoặc disagrete chúng trong nhiều bảng là một lựa chọn tồi tôi nghĩ rằng ..

0

bạn cũng có thể kiểm tra các loại cột xmlData mà là ở SQLServer hoặc loại xml trong Oracle http://msdn.microsoft.com/en-us/library/hh403385.aspx

bạn có thể tạo các cột tính toán trên cột dữ liệu xml của bạn đối với những lĩnh vực xml được truy vấn các hầu hết sẽ giúp nhanh er retrievals. Để lấy một giá trị nhất định tại một xpath nhất định, bạn chỉ cần chuyển xpath đến sqlserver để nó trả về giá trị tại xpath đó cho bạn.

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