NoQuery: dữ liệu phi cấu trúc là gì?


9

chúng tôi hiện đang chạy ở rìa tài nguyên với giải pháp dựa trên máy chủ mssql của chúng tôi.

Bây giờ chúng ta có nhiều tùy chọn truyền thống liên quan đến động thái tiếp theo để giải quyết tải:

  • mua CPU và IO nhanh hơn
  • chia một số khách hàng để tách máy chủ
  • di chuyển db đến cụm

Tất cả đều đắt về mặt cấp phép và phần cứng hoặc thời gian. Vì vậy, tôi muốn thêm một tùy chọn khác bằng cách chuyển toàn bộ hệ thống sang một giải pháp có thể mở rộng mà công cụ nosql cassandra hứa hẹn.

Tuy nhiên, tôi không chắc chắn và không có kinh nghiệm với cơ sở dữ liệu noQuery, vì vậy tôi cần hiểu cấu trúc của dữ liệu "không cấu trúc".

Trong ứng dụng của chúng tôi, về cơ bản, chúng tôi lưu trữ dữ liệu được người dùng nhập theo nhiều cách khác nhau dưới dạng danh sách "khóa-giá trị". Có một bảng cha, chứa phần tử đầu (như một Đơn hàng) và có một bảng con với các cặp giá trị khóa bao gồm các nội dung của đơn hàng (như Order_Lines).

Kinh doanh khôn ngoan, Order và OrderLines là một đơn vị. Nhưng do RDBMS, chúng được lưu trữ trong các bảng và phải được nối mọi lúc.

Trong quá trình hoạt động, đôi khi chúng tôi chọn chỉ tải phần trên cùng, nhưng hầu hết thời gian, chúng tôi tải hàng đầu + một số KVP để hiển thị một số thông tin hữu ích.

Ví dụ: trong danh sách tổng quan, chúng tôi hiển thị mã định danh đầu + một số giá trị trong các cột cho mỗi hàng.

CẬP NHẬT: Chúng tôi lưu trữ các hình thức của bất kỳ loại. Vì vậy, về cơ bản chúng tôi lưu trữ "tài liệu". Tuy nhiên, chúng tôi phải chuẩn bị và tìm kiếm thông qua các hình thức này theo bất kỳ giá trị, sắp xếp, v.v. Kiểm soát truy cập dữ liệu thêm một lớp tương tự khác trên cơ sở dữ liệu.

Như bạn có thể đoán, số lượng và tính khả dụng của một số KVP nhất định khác nhau tùy theo đối tượng. Không có khả năng hợp lệ để tạo các bảng đơn lẻ cho từng loại đối tượng vì chúng ta sẽ phải tạo hàng ngàn bảng cho các kết hợp dữ liệu khác nhau.

Loại "Từ điển" như bộ dữ liệu này sẽ được lưu trữ tốt hơn trong cơ sở dữ liệu noQuery? Và chúng ta sẽ có lợi ích hiệu suất từ ​​điều này? Cassandra sẽ mô hình hóa các đầu + KVP này dưới dạng một tập dữ liệu? Nhìn vào trang web cassandra và một số hướng dẫn, tôi có ấn tượng rằng không có quá nhiều sự khác biệt giữa RDBMS và cassandra của chúng tôi về mặt tổ chức dữ liệu - khiến chúng tôi có cùng số lượng tham gia nếu bạn muốn chọn 5 KVP cho một danh sách cho mỗi hàng.

Khai sáng được hoan nghênh, cũng chỉ ra các giấy tờ giải thích các vấn đề là ok.

Câu trả lời:


3

Có một vài khái niệm cần được phân biệt. Một là về cấu trúc và cái còn lại về lược đồ.

Dữ liệu có cấu trúc là một trong đó ứng dụng biết trước ý nghĩa của từng byte mà nó nhận được. Một ví dụ điển hình là các phép đo từ một cảm biến. Ngược lại, một luồng Twitter không có cấu trúc. Lược đồ là về bao nhiêu cấu trúc được truyền đạt tới DBMS như cách nó được yêu cầu thực thi điều này. Nó kiểm soát bao nhiêu DBMS phân tích dữ liệu mà nó lưu trữ. Một DBMS được yêu cầu lược đồ như SQL Server có thể lưu trữ dữ liệu không được mã hóa (varbinary) hoặc dữ liệu được phân tích tùy chọn (xml) và dữ liệu được phân tích cú pháp đầy đủ (cột).

Các DBMS NoQuery nằm trên một phổ từ không phân tích cú pháp (lưu trữ khóa-giá trị) trở lên. Cassandra cung cấp chức năng thực sự phong phú về mặt này. Trường hợp chúng khác nhau rõ rệt với các cửa hàng quan hệ là tính đồng nhất của dữ liệu. Khi một bảng được xác định chỉ có dữ liệu phù hợp với định nghĩa đó có thể được giữ ở đó. Tuy nhiên, trong Cassandra, ngay cả khi các cột và gia đình được xác định, không có yêu cầu nào cho bất kỳ hai hàng nào trong cùng một bảng để trông giống nhau. Nó thuộc về người thiết kế ứng dụng để quyết định bao nhiêu đi trong một hàng (còn được gọi là tài liệu) và những gì được giữ riêng, được liên kết bởi các con trỏ. Trong thực tế, bạn muốn bao nhiêu bất thường.

Ưu điểm là bạn có thể truy xuất một bộ dữ liệu đầy đủ với một lần đọc tuần tự duy nhất. Điều này là nhanh chóng. Một nhược điểm là bạn, người lập trình ứng dụng, giờ đây chỉ chịu trách nhiệm về tất cả các mối quan tâm về tính toàn vẹn dữ liệu và tính tương thích ngược, đối với mọi bit mã từng chạm vào kho dữ liệu này. Điều đó có thể khó khăn để có được đúng. Ngoài ra, bạn bị khóa vào một quan điểm về dữ liệu. Nếu bạn khóa các hàng của mình theo số thứ tự, làm thế nào để bạn báo cáo về việc bán hàng trên một sản phẩm cụ thể, hoặc khu vực hoặc khách hàng?


1
Trong trường hợp của chúng tôi, dữ liệu chúng tôi lưu trữ về cơ bản là dữ liệu. Người dùng xác định biểu mẫu trong thời gian chạy và có thể sửa đổi nó bất cứ lúc nào anh ta thích. Một hình thức có thể được xây dựng từ hàng ngàn lĩnh vực. Điều này có thể xảy ra nếu dữ liệu giống như danh sách được thu thập. Nếu chúng tôi biết dữ liệu trả trước - tại thời điểm thiết kế db, chúng tôi sẽ bình thường hóa nó. Nhận xét của bạn về chế độ xem trên dữ liệu khiến tôi nghĩ: Nếu các biểu mẫu được viết dưới dạng tài liệu, làm thế nào để bạn tạo chế độ xem trên danh sách hoặc sắp xếp dữ liệu theo một trường trong cuộc sống thực? Map-giảm dữ liệu, hồi tưởng và chuẩn bị danh sách trong mã?
thst

Trong lịch sử, tất cả là phía khách hàng - bạn đã lấy lại tài liệu của mình và bạn đã làm những gì bạn phải làm. CQL có các mệnh đề mà bất kỳ nhà phát triển SQL nào cũng sẽ quen thuộc. Map Giảm là kiến ​​trúc đi đến các bộ dữ liệu lớn. Và có vẻ như Cassandra 3.0 sẽ có Chế độ xem cụ thể hóa .
Michael Green

5

Mặc dù cơ sở dữ liệu noQuery chính là IMHO, quyết định về việc áp dụng công nghệ đó phải được đưa ra theo các thành tựu cần thiết theo thông tin được lưu trữ, không chỉ tham gia vào hiệu suất bạn hiện có. Điều này có nghĩa là có thể tùy chọn tốt nhất của bạn là bám vào cơ sở dữ liệu SQL và cải thiện CTNH của bạn.

Nhưng ngoài ra, tôi đọc một cái gì đó trong câu hỏi của bạn làm tôi suy nghĩ. Không có nhiều thông tin về trạng thái hiện tại của cơ sở dữ liệu của bạn nhưng câu của bạn "về cơ bản chúng tôi lưu trữ dữ liệu được nhập bởi người dùng theo nhiều cách khác nhau dưới dạng" danh sách khóa-giá trị " khiến tôi suy nghĩ xem liệu vấn đề có phải là mô hình dữ liệu kém hơn là thiếu tài nguyên vật lý. Tôi đã quản lý các bảng thực sự lớn (+10 tỷ hàng) với hiệu suất đáng kinh ngạc trong cơ sở dữ liệu SQL "truyền thống".

Tôi không nói là sai, chỉ là, vì dĩ nhiên tôi không thể đánh giá bạn theo mô hình dữ liệu phù hợp với ít thông tin về giải pháp hiện tại của bạn, mà chỉ nghĩ về việc xem lại mô hình dữ liệu của bạn như một tùy chọn bổ sung cùng với phần còn lại vì bạn có thể tìm thấy một số đầu mối ở đó.

Thông thường các danh sách khóa-giá trị là một sự đánh đổi khi bạn không thể triển khai mô hình ở trạng thái cuối cùng vì bạn không biết các khóa khác nhau mà bạn sẽ phải đối mặt hoặc khi nào bạn sẽ cần các giá trị của một trong những khả năng có thể chìa khóa cho một yếu tố nhất định. Nhưng khi thực hiện, tôi thường muốn nghĩ lại những quyết định như vậy sau một thời gian khi bạn đã thu thập đủ lượng thông tin để xác định trường hợp sử dụng phổ biến và quyết định xem quyết định mô hình dữ liệu là tốt nhất. Nếu bạn biết bạn sẽ có một số khóa nhất định, hãy thử thực hiện một số điểm chuẩn với thiết kế bảng thông thường theo cách truyền thống

CREATE TABLE benchmarkTable (
  element INTEGER,
  key1 VARCHAR(xx),
  key2 INTEGER,
  key3 DECIMAL(5,2),
...
);

... Và thêm các chỉ số tương ứng. Hãy thử nó và đo lường kế hoạch thực hiện với cả hai phương pháp. Bạn có thể ngạc nhiên đặc biệt nếu bạn tập hợp nhiều hơn một khóa cùng một lúc, vì, trong số các lợi thế khác, kích thước khối dữ liệu sẽ được giảm và do đó hiệu suất sẽ được cải thiện.

Hy vọng điều này sẽ giúp, hoặc ít nhất là mở rộng các khả năng và mở ra một dòng mới để điều tra.


Tôi đánh giá cao câu trả lời của bạn, nhưng trên thực tế, tình hình là như vậy, chúng tôi thực sự không biết cấu trúc của dữ liệu. Chúng tôi lưu trữ dữ liệu biểu mẫu và chúng tôi không biết cấu trúc của mô hình biểu mẫu. Tất nhiên chúng tôi biết trong ứng dụng, nhưng nó rất năng động và có thể thay đổi bất cứ lúc nào.
18:30

Hiểu. Tôi không biết thử thách này khó khăn như thế nào nhưng như một ý tưởng để thử, liệu nó có hoạt động để tạo một bảng chứa nhóm khóa chung được tham chiếu trong bảng đầy người dùng bởi một FK thực hiện, có thể là INTEGER không? Có lẽ nó hoạt động tốt hơn một chút so với việc lập chỉ mục một cột varchar, nếu nó thay đổi rất linh hoạt tôi đoán nó sẽ không ngắn. Và nó sẽ làm giảm kích thước của chỉ số là tốt.
LironCareto

1
Điều này dẫn đến câu hỏi, nhưng chúng tôi đã thảo luận về những hạn chế nhất định về khả năng của người dùng. Ví dụ: giảm các trường bảng ứng dụng tối đa xuống còn 10 trường db vanilla varchar. Đây là sự không chuẩn hóa của lược đồ để chọn về cơ bản bộ dữ liệu đầu và 10 giá trị cột ứng dụng trong một lần hoặc với tối đa một tham gia trên bảng db bổ sung. Khi thay đổi các giá trị liên quan, chúng tôi cũng sẽ phải sửa đổi một hàng db này trong mã. Điều này có vẻ khả thi và giảm số lượng tham gia lên tới 10 cho một lựa chọn để hiển thị bảng ứng dụng. Tuy nhiên, việc thay đổi định nghĩa cột ứng dụng của người dùng là rất tốn kém.
thst

1
Không sao đâu, đừng lo lắng. Tôi nghĩ rằng tôi thấy quan điểm của bạn, và cách tiếp cận của bạn xem tôi như một sự đánh đổi tốt giữa cải thiện hiệu suất và tính khả thi. Điều quan trọng là phải có số liệu thống kê sử dụng, rõ ràng, để xác định các lĩnh vực đó. Bạn đã điểm chuẩn nó? Ít nhất nó có thể mua cho bạn một thời gian cho đến khi bạn tìm thấy một giải pháp (tốt hơn? Dứt khoát?) Hoặc có thể khám phá ra rằng bạn có thể chạy với điều này trong một thời gian dài.
LironCareto
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.