Cơ sở dữ liệu lưu trữ khóa / giá trị là gì?


56

Tôi đã xem trang wikipedia cho NoQuery và nó liệt kê một số biến thể trên cơ sở dữ liệu lưu trữ Khóa / Giá trị, nhưng tôi không thể tìm thấy bất kỳ chi tiết nào về ý nghĩa của cửa hàng Khóa / Giá trị trong ngữ cảnh này. Ai đó có thể giải thích hoặc liên kết một lời giải thích cho tôi? Ngoài ra, khi nào tôi sẽ sử dụng một cơ sở dữ liệu như vậy?


3
Xin chào @ indyK1ng ... Tôi nhận thấy rằng bạn dường như đã hỏi một vài câu hỏi trên trang web, nhưng bạn chưa đưa ra nhiều bình luận về các câu hỏi. Trang web tập trung vào TƯƠNG TÁC cộng đồng và một trong những cách chúng tôi làm là bằng cách chấp nhận câu trả lời chất lượng tốt và đưa ra phản hồi khi câu trả lời không giúp chúng tôi. Tôi muốn khuyến khích bạn chấp nhận câu trả lời hoặc thêm bình luận khi họ không giúp đỡ. Cảm ơn!
jcolebrand

Thật không may, tôi đang ở trong một tình huống khó xử. Tôi đã cam kết trở lại khi đề xuất là cơ sở dữ liệu được gọi là rộng hơn, không chú ý sau đó đã thấy điều này đi vào phiên bản beta riêng tư trước khi tôi biết rằng nó đã được thay đổi thành Quản trị viên Cơ sở dữ liệu. Tôi quan tâm nhiều hơn đến các bộ phận cơ sở dữ liệu, nhưng muốn thực hiện cam kết của mình. Lấy làm tiếc.
indyK1ng

1
Vì vậy, những gì ngăn cản bạn hỏi những loại câu hỏi? Đi qua Meta, kiểm tra. Chúng tôi muốn hỏi những câu hỏi quá. Hoặc bạn có ý định rằng bạn muốn có thêm thông tin sâu sắc về cách thức hoạt động của NoQuery trong phần bên trong của nó không? Tôi cũng có thể đi sâu vào vấn đề đó, nhưng không cảm thấy đó là phạm vi của câu hỏi này.
jcolebrand

1
Ngoài ra, chấp nhận không phải là một tội lỗi ngay cả khi bạn không muốn ở đây và nó giúp những người từ google hoặc tương tự. Tôi không nói "chấp nhận tất cả câu trả lời của tôi, tôi cần người đại diện" như bạn có thể thấy nếu bạn truy cập hồ sơ của tôi, tôi không. Tôi thích thú hơn khi thấy rằng người dùng trong tương lai có thể hưởng lợi từ hướng được cung cấp bởi "đây là điều mà người hỏi thấy hữu ích".
jcolebrand

@jcolebrand Tôi nghĩ rằng những loại câu hỏi được coi là lạc đề chỉ đánh giá từ việc thay đổi tên. Đó là lý do tại sao Câu hỏi này và một vài câu hỏi khác của tôi được diễn đạt theo cách của chúng, vì vậy chúng sẽ đứng về phía chủ đề. Cảm ơn đã cho tôi biết, tôi sẽ bắt đầu tích cực hơn một khi tôi có cơ hội (đại học đang cố hết sức để chiếm thời gian của tôi, tôi đang trì hoãn ngay bây giờ;)).
indyK1ng

Câu trả lời:


42

Bạn có quen thuộc với khái niệm Cặp khóa / Giá trị không? Giả sử bạn đã quen thuộc với Java hoặc C #, đây là ngôn ngữ dưới dạng bản đồ / hàm băm / dữ liệu / KeyValuePair (cuối cùng là trong trường hợp của C #)

Cách thức hoạt động được thể hiện trong biểu đồ mẫu nhỏ này:

Color        Red
Age          18
Size         Large
Name         Smith
Title        The Brown Dog

Nơi bạn có khóa (trái) và giá trị (phải) ... chú ý nó có thể là một chuỗi, int hoặc tương tự. Hầu hết các đối tượng KVP cho phép bạn lưu trữ bất kỳ đối tượng nào ở bên phải, vì đó chỉ là một giá trị.

Vì bạn sẽ luôn có một khóa duy nhất cho một đối tượng cụ thể mà bạn muốn trả về, bạn chỉ cần truy vấn cơ sở dữ liệu cho khóa duy nhất đó và lấy lại kết quả từ bất kỳ nút nào có đối tượng (đây là lý do tại sao nó tốt cho các hệ thống phân tán, vì có những thứ khác liên quan như bỏ phiếu cho n nút đầu tiên trả về giá trị khớp với các nút khác trả về).

Bây giờ ví dụ của tôi ở trên rất đơn giản, vì vậy đây là phiên bản KVP tốt hơn một chút

user1923_color    Red
user1923_age      18
user3371_color    Blue
user4344_color    Brackish
user1923_height   6' 0"
user3371_age      34

Vì vậy, như bạn có thể thấy việc tạo khóa đơn giản là đặt "người dùng" số userunique, dấu gạch dưới và đối tượng. Một lần nữa, đây là một biến thể đơn giản, nhưng tôi nghĩ chúng ta bắt đầu hiểu rằng miễn là chúng ta có thể xác định phần bên trái và nó được định dạng nhất quán, chúng ta có thể rút ra giá trị.

Lưu ý rằng không có giới hạn về giá trị khóa (ok, có thể có một số hạn chế, chẳng hạn như chỉ có văn bản) hoặc trên thuộc tính giá trị (có thể có giới hạn kích thước) nhưng cho đến nay tôi chưa có hệ thống thực sự phức tạp. Hãy thử và đi xa hơn một chút:

app_setting_width      450
user1923_color         Red
user1923_age           18
user3371_color         Blue
user4344_color         Brackish
user1923_height        6' 0"
user3371_age           34
error_msg_457          There is no file %1 here
error_message_1        There is no user with %1 name
1923_name              Jim
user1923_name          Jim Smith
user1923_lname         Smith
Application_Installed  true
log_errors             1
install_path           C:\Windows\System32\Restricted
ServerName             localhost
test                   test
test1                  test
test123                Brackish
devonly
wonderwoman
value                  key

Bạn có ý tưởng ... tất cả những thứ đó sẽ được lưu trữ trong một "bảng" lớn trên các nút phân tán (có toán học đằng sau tất cả) và bạn sẽ chỉ hỏi hệ thống phân tán về giá trị bạn cần theo tên.

Ít nhất, đó là sự hiểu biết của tôi về cách tất cả hoạt động. Tôi có thể có một vài điều sai, nhưng đó là những điều cơ bản.


liên kết wikipedia bắt buộc http://en.wikipedia.org/wiki/Associative_array


1
thay vì chỉnh sửa Tôi sẽ đưa vào liên kết này en.wikipedia.org/wiki/Distribution_hash_table và chỉ ra rằng đây là nơi kỳ diệu của khả năng mở rộng NoQuery xuất hiện và bạn có hai tùy chọn: hoặc hiểu toán học đằng sau lý do này hoạt động, hoặc tin tưởng rằng những người thực hiện các hệ thống hiểu toán học về điều này. Tôi cũng đề xuất các podcast FLOSS cho MongoDB và một số nhóm NoQuery khác vì họ nói về những điều này chi tiết hơn twit.tv/floss
jcolebrand

Vậy thì sự khác biệt giữa cơ sở dữ liệu Key / Value và cơ sở dữ liệu định hướng hàng truyền thống là gì?
skan

1
Thực tế là thường chỉ có hai (hoặc ba hoặc một vài cột nữa, tùy thuộc vào các siêu dữ liệu liên quan) thay vì một số lượng lớn các cột và các loại thường được cố định. Không có lý do gì để KHÔNG tạo một cửa hàng KVP trong RDBMS truyền thống, ngoại trừ việc về cơ bản đó là sự coi thường.
jcolebrand

Tôi không rõ tại sao bạn lại làm user1923_color: red, user1923_age: 18, ...như vậy user1923: {color: red, age: 18, ...}.
aroth

1
Podcast FLOSS về MongoDB có tại twit.tv/shows/floss-weekly/episodes/105
eleijonmarck

25

Theo thuật ngữ SQL, cơ sở dữ liệu NoQuery là một bảng duy nhất có hai cột: một cột là Khóa (Chính) và cột còn lại là Giá trị. Và đó là tất cả, đó là tất cả các phép thuật NoQuery.

Bạn sẽ sử dụng NoQuery vì một lý do chính: khả năng mở rộng.

Nếu ứng dụng của bạn cần xử lý hàng triệu truy vấn mỗi giây, cách duy nhất để đạt được nó là thêm nhiều máy chủ. Điều đó rất rẻ và dễ dàng với NoQuery. Ngược lại, việc mở rộng cơ sở dữ liệu SQL truyền thống phức tạp hơn nhiều.

Chỉ có các trang web lớn nhất hiện đang thực sự tận dụng tiềm năng đầy đủ của NoQuery, tức là Facebook, có hàng ngàn máy chủ chạy Cassandra .

Tôi thực sự khuyên bạn nên đọc bài đăng trên blog này, so sánh SQL, NoQuery và ORM:

http://seldo.com/weblog/2010/07/12/in_defence_of_sql


Đây là lý do tại sao tôi nên chỉnh sửa câu trả lời của mình, để giải thích khả năng mở rộng hoạt động như thế nào ... Tôi quên giải thích phần đó tối qua.
jcolebrand

2
Tôi sẽ tranh luận một trường hợp tốt khác để sử dụng NoQuery là tính linh hoạt của lược đồ. Các DB như Mongo và KVP không quan tâm bạn có gì trong đó. Nếu bạn tìm kiếm cơ sở dữ liệu và nó không có một trường cụ thể, nó sẽ không trả về bất cứ thứ gì.
Snowburnt

13

Tôi giả sử bạn có hiểu biết cơ bản về chuyển động NoQuery và các mô hình cơ sở dữ liệu không liên quan.

Lưu trữ giá trị khóa là một trong những mô hình cơ sở dữ liệu không liên quan, như đồ thị, mô hình cơ sở dữ liệu hướng tài liệu.

Các cửa hàng Giá trị Chính và phong trào NoQuery

Nói chung, SQL quản lý để xử lý dữ liệu có cấu trúc đặc biệt và cho phép các truy vấn rất năng động theo nhu cầu của bộ phận được đề cập.

Mặc dù vẫn chưa có đối thủ cạnh tranh thực sự cho SQL trong lĩnh vực cụ thể này, trường hợp sử dụng trong các ứng dụng web hàng ngày là một trường hợp khác. Bạn sẽ không tìm thấy một phạm vi truy vấn rất năng động với đầy đủ các phép nối bên ngoài và bên trong, các hiệp hội và các phép tính phức tạp trên các bảng lớn. Bạn thường sẽ tìm thấy một cách suy nghĩ rất hướng đối tượng. Đặc biệt với việc áp dụng các mẫu như MVC, dữ liệu ở mặt sau thường không được mô hình hóa cho cơ sở dữ liệu, nhưng vì tính toàn vẹn logic cũng giúp mọi người có thể đối phó với việc hiểu các cơ sở hạ tầng phần mềm khổng lồ. Những gì đang được thực hiện để đưa các mô hình hướng đối tượng này vào cơ sở dữ liệu quan hệ là một lượng lớn chuẩn hóa dẫn đến hệ thống phân cấp phức tạp của các bảng và hoàn toàn chống lại ý tưởng chính đằng sau lập trình hướng đối tượng.

Thực tế là SQL cho phép các truy vấn động tùy ý cho các tập hợp dữ liệu phức tạp sẽ trở nên vô dụng khi chỉ sử dụng Cơ sở dữ liệu SQL để lưu trữ dữ liệu hướng đối tượng liên tục, đó là điều mà hầu hết các ứng dụng thực hiện ngày nay.

Đây là nơi các cửa hàng Giá trị Chính đi vào hoạt động. Key value stores allow the application developer to store schema-less data. This data is usually consisting of a string which represents the key and the actual data which is considered to be the value in the "key - value" relationship. Bản thân dữ liệu thường là một loại nguyên thủy của ngôn ngữ lập trình (một chuỗi, một số nguyên, một mảng) hoặc một đối tượng đang bị thay thế bởi các ngôn ngữ lập trình liên kết với kho lưu trữ giá trị khóa. Điều này thay thế cho nhu cầu về mô hình dữ liệu cố định và làm cho yêu cầu về dữ liệu được định dạng đúng ít nghiêm ngặt hơn.

They all allow storage of arbitrary data which is being indexed using a single key to allow retrieval. Sự khác biệt lớn nhất đối với các cửa hàng "đơn giản hơn" là cách bạn có thể (hoặc không thể) xác thực hoặc truy cập các cửa hàng khác nhau (nếu có thể). Mặc dù lợi thế về tốc độ trong việc lưu trữ và truy xuất dữ liệu có thể là một lý do để xem xét nó trên Cơ sở dữ liệu SQL thông thường, một lợi thế lớn khác xuất hiện khi sử dụng các kho lưu trữ khóa-giá trị là mã kết quả có xu hướng trông rõ ràng và đơn giản khi so sánh với các chuỗi SQL nhúng trong ngôn ngữ lập trình của bạn. Đây là điều mà mọi người có xu hướng chiến đấu với các khung ánh xạ quan hệ đối tượng như Hibernate hoặc Active Record. Về cơ bản, có một trình ánh xạ quan hệ đối tượng dường như mô phỏng một kho lưu trữ giá trị khóa bằng cách thêm rất nhiều mã thực sự phức tạp giữa cơ sở dữ liệu SQL và ngôn ngữ lập trình hướng đối tượng.

Cả một cộng đồng người đến với nhau dưới thẻ " NoQuery " và thảo luận về những ưu điểm này cũng như những nhược điểm của việc sử dụng các lựa chọn thay thế cho các hệ thống quản lý cơ sở dữ liệu hợp lý. đọc thêm
Đây là một bài viết hơi cũ, nhưng tôi thấy rất hữu ích.

when would I use such a database? Could someone explain or link an explanation to me?
Đó là quyết định kiến ​​trúc nhiều hơn, và một quyết định gây tranh cãi ... Bạn phải xem xét rất nhiều yếu tố như khả năng mở rộng, hiệu suất, v.v ...

Xem các slide / bài viết dưới đây và bạn sẽ có một ý tưởng, khi nào, tại sao và tại sao không sử dụng kho lưu trữ giá trị chính :)


12

Những người khác đã giải thích điều này, nhưng dù sao tôi cũng sẽ đâm.

Cơ sở dữ liệu khóa / giá trị lưu trữ dữ liệu theo khóa chính. Điều này cho phép chúng tôi xác định duy nhất một bản ghi trong một thùng. Vì tất cả các giá trị là duy nhất, việc tra cứu cực kỳ nhanh: đó luôn là một tìm kiếm đĩa đơn giản.

Giá trị chỉ là bất kỳ loại giá trị. Cách dữ liệu được lưu trữ mờ đục đối với cơ sở dữ liệu. Khi bạn lưu trữ dữ liệu trong kho lưu trữ khóa / giá trị, cơ sở dữ liệu sẽ không biết hoặc quan tâm nếu đó là XML, JSON, văn bản hoặc hình ảnh. Trên thực tế, những gì chúng tôi đang làm trong kho lưu trữ khóa / giá trị đang chuyển trách nhiệm tìm hiểu cách dữ liệu được lưu trữ từ cơ sở dữ liệu vào các ứng dụng truy xuất dữ liệu của chúng tôi. Vì bạn chỉ có một phạm vi khóa duy nhất để lo lắng về mỗi nhóm, nên rất dễ dàng trải đều các khóa trên nhiều máy chủ và sử dụng các kỹ thuật lập trình phân tán để dữ liệu này có thể được truy cập nhanh chóng (mỗi máy chủ lưu trữ một phạm vi dữ liệu) .

Một nhược điểm của phương pháp tiếp cận dữ liệu này là tìm kiếm là một nhiệm vụ rất khó khăn. Bạn cần phải đọc mọi bản ghi trong dữ liệu của nhóm hoặc nếu không bạn cần tự xây dựng các chỉ mục phụ .

Có một vài lý do bạn có thể muốn sử dụng cơ sở dữ liệu khóa / giá trị:

  • Khi viết hiệu suất là ưu tiên cao nhất của bạn. Mozilla Test Pilot sử dụng cơ sở dữ liệu khóa / giá trị để nhanh chóng ghi lại dữ liệu.
  • Khi đọc được đảm bảo chỉ xảy ra bởi PK.
  • Khi bạn đang làm việc với một mô hình dữ liệu phẳng.
  • Khi bạn đang làm việc với một mô hình dữ liệu phức tạp, phong phú không thể được mô hình hóa trong RDBMS.

Có nhiều lý do để sử dụng cơ sở dữ liệu khóa / giá trị cũng như sử dụng RDBMS và có nhiều đối số để biện minh cho nhau. Điều quan trọng là hãy xem cách bạn truy vấn dữ liệu của mình và hiểu cách mẫu truy cập dữ liệu đó hướng dẫn cách bạn sẽ chèn và lưu trữ dữ liệu.

Chỉ cần nhớ rằng cơ sở dữ liệu khóa / giá trị chỉ là một loại cơ sở dữ liệu NoQuery.


8

Nếu bạn có cơ sở dữ liệu quan hệ, thì bạn có thể dễ dàng thử nghiệm điều này:

create table keyvalue (my_key varchar2(255), my_value varchar2(255));
create unique index ix_keyvalue on keyvalue (my_key, my_value);

Đây là cách tất cả các cơ sở dữ liệu được sử dụng, với Berkeley DBM là một ví dụ điển hình, từ năm 1979. Kể từ đó, mọi thứ đã tiến triển (bạn có thể có nhiều giá trị cho mỗi khóa trong bất kỳ RDBMS nào). Đối với nhiều ứng dụng, kho lưu trữ khóa-giá trị là đủ (ví dụ: đây là cách sendmail lưu trữ bí danh của nó). Nhưng nếu bạn thấy mình đang xử lý trước giá trị trong mã của riêng bạn (hoặc nối chuỗi để tạo "khóa"), có thể chia giá trị trên dấu phân cách hoặc phân tích cú pháp, trước khi bạn có thể sử dụng nó, có lẽ bạn sẽ tốt hơn với một RDBMS và thực sự lưu trữ nó theo cách đó.


Vẫn chưa rõ từ Gaius trả lời DB giá trị khóa 'NoQuery' mới có thể làm gì mà bảng mà anh mô tả ở trên không thể làm được. Ngoài việc tách bảng thành một bảng khác nhau trên một nút máy chủ khác.
GyRo

2
Chia tách là chính và không giảm giá nó, sự khác biệt. Khi bạn có TON dữ liệu có thể xử lý song song việc lấy lại trên nhiều máy chủ có thể là một sự khác biệt lớn về tốc độ.
dùng441521
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.