ฐานข้อมูลที่จัดเก็บคีย์ / ค่าคืออะไร


56

ฉันได้ดูหน้าวิกิพีเดียสำหรับ NoSQL แล้วและมีการเปลี่ยนแปลงหลายรายการในฐานข้อมูลที่เก็บคีย์ / ค่า แต่ฉันไม่พบรายละเอียดเกี่ยวกับความหมายของที่เก็บคีย์ / ค่าในบริบทนี้ ใครช่วยอธิบายหรือเชื่อมโยงคำอธิบายกับฉัน นอกจากนี้เมื่อใดที่ฉันจะใช้ฐานข้อมูลดังกล่าว


3
สวัสดี @ indyK1ng ... ฉันสังเกตว่าคุณดูเหมือนจะถามคำถามสองสามข้อในเว็บไซต์ แต่คุณไม่ได้ให้ความเห็นเกี่ยวกับคำถามมากมาย เว็บไซต์นี้มุ่งเน้นไปที่การโต้ตอบกับชุมชนและหนึ่งในวิธีที่เราดำเนินการคือการยอมรับคำตอบที่มีคุณภาพดีและให้ข้อเสนอแนะเมื่อคำตอบไม่ได้ช่วยเรา ฉันอยากจะแนะนำให้คุณยอมรับคำตอบหรือเพิ่มความเห็นที่พวกเขาไม่ได้ช่วย ขอบคุณ!
jcolebrand

น่าเสียดายที่ฉันอยู่ในสถานการณ์ที่น่าอึดอัดใจเล็กน้อย ฉันมุ่งมั่นย้อนกลับไปเมื่อข้อเสนอเป็นฐานข้อมูล termed ที่กว้างขึ้นไม่ได้ใส่ใจเลยเห็นว่านี่เป็นรุ่นเบต้าส่วนตัวก่อนที่ฉันจะรู้ว่ามันถูกเปลี่ยนเป็นผู้ดูแลฐานข้อมูล ฉันสนใจอวัยวะภายในของฐานข้อมูลมากขึ้น แต่ต้องการเติมเต็มความมุ่งมั่นของฉัน ขอโทษ
indyK1ng

1
แล้วคุณจะหยุดถามคำถามเหล่านั้นได้อย่างไร ไปที่ Meta ตรวจสอบ เราต้องการถามคำถามเหล่านั้นด้วย หรือคุณตั้งใจว่าคุณต้องการข้อมูลเชิงลึกเพิ่มเติมเกี่ยวกับการทำงานของ NoSQL ภายในองค์กร ฉันสามารถเข้าไปในนั้นด้วย แต่ไม่รู้สึกว่ามันเป็นขอบเขตของคำถามนี้
jcolebrand

1
นอกจากนี้การยอมรับไม่ใช่บาปแม้ว่าคุณจะไม่ต้องการอยู่ที่นี่และมันก็ช่วยคนเหล่านั้นจาก google หรือสิ่งอื่นที่คล้ายคลึงกัน ฉันไม่ได้พูดว่า "ยอมรับคำตอบทั้งหมดของฉันฉันต้องการตัวแทน" ตามที่คุณเห็นว่าคุณเยี่ยมชมโปรไฟล์ของฉันหรือไม่ ฉันสนใจที่จะเห็นว่าผู้ใช้ในอนาคตจะได้รับประโยชน์จากทิศทางที่ระบุโดย "นี่คือสิ่งที่ผู้ถามพบว่ามีประโยชน์"
jcolebrand

@ jcolebrand ฉันคิดว่าคำถามเหล่านั้นถูกพิจารณาว่าเป็นหัวข้อที่เพิ่งตัดสินจากการเปลี่ยนชื่อ นั่นเป็นเหตุผลที่คำถามนี้และคำถามอื่น ๆ ของฉันถูกพูดอย่างที่พวกเขาเป็นดังนั้นพวกเขาจะอยู่ด้านข้างของหัวข้อ ขอขอบคุณที่แจ้งให้ฉันทราบฉันจะเริ่มมีความกระตือรือร้นมากขึ้นเมื่อฉันมีโอกาส (วิทยาลัยกำลังพยายามอย่างเต็มที่ที่จะใช้เวลาของฉัน
indyK1ng

คำตอบ:


42

คุณคุ้นเคยกับแนวคิดของคู่คีย์ / ค่าหรือไม่ สมมติว่าคุณคุ้นเคยกับ Java หรือ C # นี่เป็นภาษาเป็นแผนที่ / hash / datatable / KeyValuePair (อันสุดท้ายคือในกรณีของ C #)

วิธีการทำงานแสดงให้เห็นในแผนภูมิตัวอย่างเล็ก ๆ นี้:

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

ที่ซึ่งคุณมีคีย์ (ซ้าย) และค่า (ขวา) ... โปรดสังเกตว่าอาจเป็นสตริง int หรือค่าที่คล้ายกัน วัตถุ KVP ส่วนใหญ่อนุญาตให้คุณจัดเก็บวัตถุใด ๆ ทางด้านขวาเนื่องจากเป็นเพียงค่า

เนื่องจากคุณจะมีคีย์เฉพาะสำหรับวัตถุเฉพาะที่คุณต้องการส่งคืนคุณสามารถสืบค้นฐานข้อมูลสำหรับคีย์เฉพาะนั้นและรับผลลัพธ์จากโหนดใดก็ตามที่มีวัตถุ (นี่คือสาเหตุที่ดีสำหรับระบบกระจาย เนื่องจากมีสิ่งอื่น ๆ ที่เกี่ยวข้องเช่นการสำรวจเพื่อให้โหนด n แรกเพื่อส่งคืนค่าที่ตรงกับโหนดอื่นกลับมา)

ตอนนี้ตัวอย่างของฉันง่ายมากดังนั้นนี่คือ KVP เวอร์ชันที่ดีกว่าเล็กน้อย

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

ดังนั้นอย่างที่คุณเห็นการสร้างคีย์อย่างง่ายคือการใส่ "user" หมายเลข userunique เครื่องหมายขีดล่างและวัตถุ นี่เป็นรูปแบบที่เรียบง่ายอีกครั้ง แต่ฉันคิดว่าเราเริ่มเข้าใจว่าตราบใดที่เราสามารถกำหนดส่วนทางซ้ายและจัดรูปแบบได้อย่างต่อเนื่องเราสามารถดึงค่าออกมาได้

โปรดสังเกตว่าไม่มีการ จำกัด ค่าคีย์ (ตกลงอาจมีข้อ จำกัด บางประการเช่นข้อความเท่านั้น) หรือคุณสมบัติค่า (อาจมีการ จำกัด ขนาด) แต่จนถึงตอนนี้ฉันยังไม่มีระบบที่ซับซ้อนจริงๆ ลองอีกสักหน่อย:

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

คุณได้ความคิด ... สิ่งเหล่านั้นจะถูกเก็บไว้ใน "table" อันยิ่งใหญ่บนโหนดกระจาย (มีคณิตศาสตร์อยู่ข้างหลังทั้งหมด) และคุณจะถามระบบกระจายสำหรับค่าที่คุณต้องการด้วยชื่อ

อย่างน้อยที่สุดนั่นคือความเข้าใจของฉันเกี่ยวกับการทำงานทั้งหมด ฉันอาจมีบางสิ่งผิดปกติ แต่นั่นคือพื้นฐาน


การเชื่อมโยงวิกิพีเดียบังคับhttp://en.wikipedia.org/wiki/Associative_array


1
แทนที่จะแก้ไขฉันเพิ่งจะรวมลิงค์นี้en.wikipedia.org/wiki/Distributed_hash_tableและชี้ให้เห็นว่านี่เป็นที่ซึ่งความมหัศจรรย์ของ NoSQL scalability เข้ามาและคุณมีสองตัวเลือก: เข้าใจคณิตศาสตร์เบื้องหลังว่าทำไมสิ่งนี้ ทำงานหรือเชื่อมั่นว่าคนที่ใช้ระบบเข้าใจคณิตศาสตร์ในเรื่องนี้ ฉันยังแนะนำพอดแคสต์ FLOSS สำหรับ MongoDB และกลุ่ม NoSQL อื่น ๆ อีกมากมายเพราะพวกเขาพูดถึงสิ่งเหล่านี้ในรายละเอียดเพิ่มเติมtwit.tv/floss
jcolebrand

แล้วความแตกต่างระหว่างฐานข้อมูลคีย์ / ค่าและฐานข้อมูลแถวแบบดั้งเดิมคืออะไร
skan

1
ความจริงที่ว่ามีคอลัมน์เพียงสอง (หรือสามหรือสองสามเท่านั้น) ขึ้นอยู่กับคอลัมน์ข้อมูลเมตาที่เกี่ยวข้อง) แทนที่จะเป็นคอลัมน์จำนวนมากและประเภทมักจะได้รับการแก้ไข ไม่มีเหตุผลที่จะไม่สร้างร้านค้า KVP ใน RDBMS แบบดั้งเดิมยกเว้นว่าโดยทั่วไปจะไม่มีการวางแผน
jcolebrand

มันไม่ชัดเจนสำหรับฉันว่าทำไมคุณถึงทำuser1923_color: red, user1923_age: 18, ...อย่างuser1923: {color: red, age: 18, ...}นั้น
aroth

1
พอดแคสต์ FLOSS เกี่ยวกับ MongoDB อยู่ที่twit.tv/shows/floss-weekly/episodes/105
eleijonmarck

25

ในแง่ของ SQL ฐานข้อมูล NoSQL เป็นตารางเดียวที่มีสองคอลัมน์หนึ่งอันคือคีย์ (หลัก) และอีกอันหนึ่งเป็นค่า และนั่นคือทั้งหมดที่วิเศษ NoSQL

คุณจะใช้ NoSQL ด้วยเหตุผลหลักประการหนึ่ง: ความสามารถในการขยาย

หากแอปพลิเคชันของคุณต้องการจัดการกับข้อความค้นหานับล้านต่อวินาทีวิธีเดียวที่จะทำให้สำเร็จคือการเพิ่มเซิร์ฟเวอร์มากขึ้น นั่นคือราคาถูกมากและใช้งานง่ายด้วย NoSQL ในทางตรงกันข้ามการปรับขนาดฐานข้อมูล SQL แบบดั้งเดิมนั้นซับซ้อนกว่ามาก

เฉพาะเว็บไซต์ที่ใหญ่ที่สุดออกมีเป็นจริงการใช้ประโยชน์จากศักยภาพ NoSQL เต็มรูปแบบเช่น Facebook, มีหลายพันเซิร์ฟเวอร์ที่ใช้คาสซานดรา

ฉันขอแนะนำให้อ่านโพสต์บล็อกนี้เปรียบเทียบ SQL, NoSQL และ ORM:

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


นี่คือเหตุผลที่ฉันควรแก้ไขคำตอบของฉันเพื่ออธิบายว่า scalability ทำงานอย่างไร ... ฉันลืมอธิบายส่วนนั้นเมื่อคืนนี้
jcolebrand

2
ฉันจะเถียงอีกกรณีที่ดีที่จะใช้ NoSQL คือความยืดหยุ่นของสคี ฐานข้อมูลอย่าง Mongo และ KVP ไม่สนใจสิ่งที่คุณมี หากคุณค้นหาฐานข้อมูลและมันไม่มีฟิลด์ที่เจาะจงมันจะไม่ส่งคืนอะไรเลย
Snowburnt

13

ฉันถือว่าคุณมีความเข้าใจพื้นฐานเกี่ยวกับการเคลื่อนไหว NoSQL และโมเดลฐานข้อมูลที่ไม่เกี่ยวข้อง

Key Value store เป็นหนึ่งในโมเดลฐานข้อมูลที่ไม่เกี่ยวข้องเช่นกราฟ, โมเดลฐานข้อมูลเอกสาร

ที่เก็บค่าคีย์และการเคลื่อนไหว NoSQL

โดยทั่วไปแล้ว SQL สามารถจัดการกับข้อมูลที่มีโครงสร้างเป็นพิเศษและอนุญาตให้มีการสืบค้นที่มีพลวัตสูงตามความต้องการของแผนกที่ต้องการ

ในขณะที่ยังไม่มีคู่แข่งที่แท้จริงสำหรับ SQL ในฟิลด์เฉพาะนี้กรณีการใช้งานในเว็บแอปพลิเคชันประจำวันจะแตกต่างกัน คุณจะไม่พบข้อความค้นหาที่มีช่วงไดนามิกสูงซึ่งเต็มไปด้วยการรวมด้านนอกและด้านในสหภาพและการคำนวณที่ซับซ้อนเหนือตารางขนาดใหญ่ คุณมักจะพบวิธีคิดเชิงวัตถุมาก โดยเฉพาะอย่างยิ่งกับการใช้รูปแบบเช่น MVC ข้อมูลใน back-end มักจะไม่ได้ถูกสร้างแบบจำลองสำหรับฐานข้อมูล แต่สำหรับความสมบูรณ์ทางตรรกะซึ่งยังช่วยให้ผู้คนสามารถรับมือกับการทำความเข้าใจโครงสร้างพื้นฐานซอฟต์แวร์ขนาดใหญ่ สิ่งที่ทำเพื่อวางโมเดลเชิงวัตถุเหล่านี้ลงในฐานข้อมูลเชิงสัมพันธ์เป็นจำนวนมากของการทำให้เป็นมาตรฐานซึ่งนำไปสู่ลำดับชั้นที่ซับซ้อนของตารางและนำพาแนวคิดหลักที่อยู่เบื้องหลังการเขียนโปรแกรมเชิงวัตถุอย่างสมบูรณ์

ความจริงที่ว่า SQL อนุญาตให้การสืบค้นแบบไดนามิกโดยพลการสำหรับชุดข้อมูลที่ซับซ้อนนั้นถูกแสดงผลโดยใช้ฐานข้อมูล SQL สำหรับการจัดเก็บข้อมูลเชิงวัตถุแบบถาวรซึ่งเป็นสิ่งที่โดยทั่วไปแอปพลิเคชันส่วนใหญ่ทำในปัจจุบัน

นี่คือที่มาของร้าน Key Value ที่เข้ามาเล่น 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. ข้อมูลเองมักจะเป็นภาษาดั้งเดิมของภาษาโปรแกรม (สตริง, จำนวนเต็ม, อาร์เรย์) หรือวัตถุที่กำลังถูก marshalled โดยภาษาการเขียนโปรแกรมเชื่อมโยงกับที่เก็บค่าคีย์ สิ่งนี้แทนที่ความต้องการโมเดลข้อมูลคงที่และทำให้ข้อกำหนดสำหรับข้อมูลที่จัดรูปแบบอย่างถูกต้องเข้มงวดน้อยกว่า

They all allow storage of arbitrary data which is being indexed using a single key to allow retrieval. ความแตกต่างที่ใหญ่ที่สุดสำหรับร้านค้า "เรียบง่าย" คือวิธีที่คุณสามารถ (หรือไม่สามารถ) ตรวจสอบหรือเข้าถึงร้านค้าต่างๆ (ถ้าเป็นไปได้) ในขณะที่ข้อได้เปรียบด้านความเร็วในการจัดเก็บและเรียกข้อมูลอาจเป็นเหตุผลในการพิจารณามากกว่าฐานข้อมูล SQL ทั่วไปข้อดีอีกข้อใหญ่ที่เกิดขึ้นเมื่อใช้ที่เก็บคีย์ - ค่าคือรหัสผลลัพธ์นั้นดูสะอาดและเรียบง่ายเมื่อเปรียบเทียบกับสตริง SQL ฝังตัว ภาษาโปรแกรมของคุณ นี่คือสิ่งที่ผู้คนมักจะต่อสู้กับกรอบการทำแผนที่วัตถุสัมพันธ์เช่น Hibernate หรือ Active Record การมีผู้ทำแผนที่เชิงสัมพันธ์ของวัตถุโดยทั่วไปดูเหมือนว่าจะเลียนแบบที่เก็บค่าคีย์โดยการเพิ่มรหัสที่ซับซ้อนมากระหว่างฐานข้อมูล SQL และภาษาการเขียนโปรแกรมเชิงวัตถุ

ชุมชนทั้งหมดของผู้คนมารวมตัวกันภายใต้แท็ก " NoSQL " และหารือเกี่ยวกับข้อดีเหล่านี้และข้อเสียของการใช้ทางเลือกในการจัดการระบบฐานข้อมูล อ่านเพิ่มเติม
นี่เป็นบทความเก่า ๆ แต่ฉันพบว่ามีประโยชน์มาก

when would I use such a database? Could someone explain or link an explanation to me?
มันเป็นการตัดสินใจทางสถาปัตยกรรมมากกว่าและเป็นที่ถกเถียงกันอยู่ ... คุณต้องพิจารณาปัจจัยหลายอย่างเช่นความสามารถในการปรับขนาดประสิทธิภาพ ฯลฯ

ดูสไลด์ / บทความด้านล่างและคุณจะได้รับแนวคิดเมื่อใดทำไมและทำไมไม่ใช้ที่เก็บค่าคีย์ :)


12

มีคนอื่นอธิบายเรื่องนี้ แต่ฉันจะไปแทงต่อไป

ฐานข้อมูลคีย์ / ค่าจะเก็บข้อมูลตามคีย์หลัก สิ่งนี้ทำให้เราสามารถระบุเร็กคอร์ดในที่ฝากข้อมูลโดยไม่ซ้ำกัน เนื่องจากค่าทั้งหมดเป็นค่าเฉพาะการค้นหาจึงรวดเร็วอย่างไม่น่าเชื่อ: เป็นดิสก์ที่ค้นหาได้ง่ายเสมอ

ค่าเป็นเพียงมูลค่าใด ๆ วิธีการจัดเก็บข้อมูลจะทึบไปยังฐานข้อมูลเอง เมื่อคุณเก็บข้อมูลในที่เก็บคีย์ / ค่าฐานข้อมูลจะไม่ทราบหรือไม่สนใจว่าเป็น XML, JSON, ข้อความหรือรูปภาพ ผลที่ได้คือสิ่งที่เราทำในที่เก็บคีย์ / ค่าคือการย้ายความรับผิดชอบในการทำความเข้าใจวิธีการจัดเก็บข้อมูลออกจากฐานข้อมูลไปยังแอปพลิเคชันที่ดึงข้อมูลของเรา เนื่องจากคุณมีคีย์เพียงช่วงเดียวเท่านั้นที่ต้องกังวลต่อการฝากข้อมูลจึงง่ายมากในการกระจายคีย์ไปยังเซิร์ฟเวอร์หลาย ๆ เครื่องและใช้เทคนิคการเขียนโปรแกรมแบบกระจายเพื่อให้สามารถเข้าถึงข้อมูลนี้ได้อย่างรวดเร็ว (เซิร์ฟเวอร์ทุกเครื่องเก็บช่วงข้อมูลไว้) .

ข้อเสียเปรียบของวิธีการข้อมูลนี้คือการค้นหาเป็นงานที่ยากมาก คุณต้องอ่านทุก ๆ ระเบียนในที่เก็บข้อมูลของคุณหรืออื่น ๆ ที่คุณต้องการสร้างดัชนีรองด้วยตัวคุณเอง

มีสาเหตุบางประการที่คุณอาจต้องการใช้ฐานข้อมูลคีย์ / ค่า:

  • เมื่อประสิทธิภาพการเขียนเป็นสิ่งสำคัญที่สุดของคุณ Mozilla Test Pilotใช้ฐานข้อมูลคีย์ / ค่าเพื่อบันทึกข้อมูลอย่างรวดเร็ว
  • เมื่อการอ่านถูกรับประกันว่าจะเกิดขึ้นโดย PK เท่านั้น
  • เมื่อคุณทำงานกับโมเดลข้อมูลแบบแบน
  • เมื่อคุณทำงานกับโมเดลข้อมูลที่ซับซ้อนและซับซ้อนซึ่งไม่สามารถสร้างแบบจำลองใน RDBMS

มีเหตุผลมากมายเกี่ยวกับการใช้ฐานข้อมูลคีย์ / ค่าเช่นเดียวกับการใช้ RDBMS และมีข้อโต้แย้งมากมายที่จะพิสูจน์ว่ามีเหตุผลมากกว่าอีกข้อหนึ่ง สิ่งสำคัญคือการดูว่าคุณทำการสืบค้นข้อมูลของคุณอย่างไรและเข้าใจว่ารูปแบบการเข้าถึงข้อมูลเป็นแนวทางอย่างไรในการแทรกและจัดเก็บข้อมูล

เพียงจำไว้ว่าฐานข้อมูลคีย์ / ค่าเป็นฐานข้อมูล NoSQL เพียงประเภทเดียว


8

หากคุณมีฐานข้อมูลเชิงสัมพันธ์คุณสามารถทดลองกับสิ่งนี้ได้อย่างง่ายดาย:

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

นี่คือวิธีที่ฐานข้อมูลทั้งหมดที่ใช้จะเป็นกับเบิร์กลีย์ DBMเป็นตัวอย่างที่ดีจากปี 1979 ตั้งแต่นั้นมาสิ่งที่มีขั้นสูง (คุณสามารถมีหลายค่าต่อคีย์ใน RDBMS ใด ๆ ) สำหรับหลาย ๆ แอปพลิเคชันที่เก็บคีย์ - ค่าก็เพียงพอ (เช่นนี่คือวิธีที่ sendmail จัดเก็บสมนาม) แต่ถ้าคุณพบว่าคุณกำลังประมวลผลค่าล่วงหน้าในรหัสของคุณเอง (หรือการต่อสตริงเพื่อสร้าง "คีย์" ของคุณ) อาจแบ่งค่าบนตัวคั่นหรือการแยกวิเคราะห์ก่อนที่คุณจะสามารถใช้งานได้คุณอาจจะดีกว่า RDBMS และเก็บไว้อย่างนั้น


ยังไม่ชัดเจนจาก Gaius ตอบว่าฐานข้อมูลคีย์ - ค่า 'NoSQL' ใหม่สามารถทำอะไรได้ตารางที่เขาอธิบายข้างต้นไม่สามารถทำได้ นอกเหนือจากการแยกตารางไปยังตารางอื่นบนโหนดเซิร์ฟเวอร์ที่แตกต่างกัน
GyRo

2
การแยกเป็นหลักและไม่ลดความแตกต่างเมื่อคุณมีข้อมูลจำนวนมากที่สามารถประมวลผลแบบขนานได้รับข้อมูลกลับมาที่เซิร์ฟเวอร์หลายเครื่อง
user441521
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.