Báo giá này không phải là về việc sử dụng XML làm định dạng lưu trữ nói chung (mà nó vẫn ổn, tùy thuộc vào yêu cầu), nhưng đối với lưu trữ kiểu cơ sở dữ liệu .
Khi mọi người nói về cơ sở dữ liệu, họ thường có nghĩa là hệ thống lưu trữ lưu trữ lượng dữ liệu khổng lồ , thường là trong phạm vi gigabyte hoặc terabyte. Một cơ sở dữ liệu có khả năng lớn hơn nhiều so với dung lượng RAM có sẵn trên máy chủ lưu trữ nó. Vì không ai cần tất cả dữ liệu trong cơ sở dữ liệu cùng một lúc, cơ sở dữ liệu nên được tối ưu hóa để truy xuất nhanh các tập hợp con chọn lọc của dữ liệu của họ: đây là những gì SELECT
tuyên bố dành cho và cơ sở dữ liệu quan hệ cũng như các giải pháp NoQuery tối ưu hóa định dạng lưu trữ nội bộ của họ nhanh chóng thu hồi các tập con như vậy.
XML, tuy nhiên, không thực sự phù hợp với các yêu cầu này. Do cấu trúc thẻ lồng nhau của nó, không thể xác định vị trí nào trong tệp có giá trị nhất định (về phần bù byte vào tệp) mà không đi bộ toàn bộ cây tài liệu, ít nhất là phù hợp. Cơ sở dữ liệu quan hệ có các chỉ mục và tìm kiếm một giá trị trong một chỉ mục, ngay cả với triển khai tìm kiếm nhị phân nguyên thủy, là một tra cứu O (log n), và sau đó nhận được các giá trị thực tế không gì khác ngoài tìm kiếm tệp (ví dụ: fseek(data_file_handle, row_index * row_size)
), đó là O (1). Trong tệp XML, cách hiệu quả nhất là chạy trình phân tích cú pháp SAX trên tài liệu của bạn, thực hiện rất nhiều lần đọc và tìm kiếm trước khi bạn nhận được dữ liệu thực tế của mình; bạn khó có thể có được điều này tốt hơn O (n), trừ khi bạn sử dụng các chỉ mục, nhưng sau đó, bạn phải xây dựng lại toàn bộ chỉ mục cho mỗi lần chèn (xem bên dưới).
Chèn thậm chí còn tồi tệ hơn. Cơ sở dữ liệu quan hệ không đảm bảo thứ tự hàng, có nghĩa là họ chỉ có thể nối thêm các hàng mới hoặc ghi đè lên bất kỳ hàng nào được đánh dấu là 'đã xóa'. Điều này cực kỳ nhanh: DB chỉ có thể giữ một nhóm các vị trí có thể ghi được xung quanh; nhận được một mục từ hồ bơi là O (1) trừ khi hồ bơi trống; trường hợp xấu nhất, pool trống và một trang mới phải được tạo, nhưng đây cũng là O (1). Ngược lại, cơ sở dữ liệu dựa trên XML sẽ phải di chuyển mọi thứ sau điểm chèn để tạo khoảng trống; đây là O (n). Khi các chỉ mục đi vào hoạt động, mọi thứ trở nên thú vị hơn: các chỉ mục cơ sở dữ liệu quan hệ điển hình có thể được cập nhật với độ phức tạp tương đối thấp, giả sử O (log n); nhưng nếu bạn muốn lập chỉ mục các tệp XML của mình, mọi thao tác chèn có khả năng thay đổi vị trí trên đĩa của mọi giá trị trong tài liệu, vì vậy bạn phảixây dựng lại toàn bộ chỉ số . Điều này cũng áp dụng cho các bản cập nhật, bởi vì việc cập nhật, giả sử, nội dung văn bản của một phần tử, có thể thay đổi kích thước của nó, có nghĩa là XML liên tiếp phải thay đổi. Một cơ sở dữ liệu quan hệ hoàn toàn không phải chạm vào chỉ mục nếu bạn cập nhật một cột không được lập chỉ mục; một cơ sở dữ liệu XML sẽ phải xây dựng lại toàn bộ chỉ mục cho mỗi bản cập nhật thay đổi kích thước của nút XML được cập nhật.
Đó là những nhược điểm quan trọng nhất, nhưng có nhiều hơn. XML rất dài dòng, rất tốt cho giao tiếp giữa máy chủ với máy chủ, bởi vì nó tăng thêm tính an toàn (máy chủ nhận có thể thực hiện tất cả các loại kiểm tra tính toàn vẹn trên XML và nếu có bất kỳ lỗi nào xảy ra trong quá trình chuyển, tài liệu không có khả năng xác thực ). Tuy nhiên, đối với lưu trữ dung lượng lớn, điều này rất nguy hiểm: không có gì lạ khi có 100% chi phí trở lên cho dữ liệu XML (không có gì lạ khi thấy tỷ lệ chi phí trong phạm vi 1000% cho những thứ như tin nhắn SOAP), trong khi lưu trữ DB quan hệ điển hình các lược đồ chỉ có một chi phí không đổi cho siêu dữ liệu bảng, cộng với một bit nhỏ trên mỗi hàng; hầu hết các chi phí trong cơ sở dữ liệu quan hệ đến từ độ rộng cột cố định. Nếu bạn có một terabyte dữ liệu, 500% chi phí đơn giản là không thể chấp nhận được, vì nhiều lý do.