हैश और रेंज प्राथमिक कुंजी क्या है?


219

मैं यह समझने में सक्षम नहीं हूं कि यहां रेंज की प्राथमिक कुंजी क्या है -

http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/WorkingWithTables.html#WorkingWithTables.primary.key

और यह कैसे काम करता है?

"हैश विशेषता पर अनियंत्रित हैश इंडेक्स और रेंज विशेषता पर एक सॉर्ट किए गए रेंज इंडेक्स" से उनका क्या मतलब है?

जवाबों:


571

" हैश एंड रेंज प्राइमरी की " का अर्थ है कि डायनमोबी में एक एकल पंक्ति में हैश और रेंज कुंजी दोनों से बना एक अद्वितीय प्राथमिक कुंजी है । उदाहरण के लिए, X की हैश कुंजी और Y की श्रेणी कुंजी के साथ , आपकी प्राथमिक कुंजी प्रभावी रूप से XY है । आपके पास समान हैश कुंजी के लिए कई रेंज कुंजियाँ हो सकती हैं, लेकिन संयोजन अद्वितीय होना चाहिए, जैसे XZ और XA । आइए प्रत्येक प्रकार की तालिका के लिए उनके उदाहरणों का उपयोग करें:

हैश प्राथमिक कुंजी - प्राथमिक कुंजी एक विशेषता, एक हैश विशेषता से बना है। उदाहरण के लिए, ProductCatalog तालिका ProductID को अपनी प्राथमिक कुंजी के रूप में रख सकती है। DynamoDB इस प्राथमिक कुंजी विशेषता पर एक अनियंत्रित हैश इंडेक्स बनाता है।

इसका मतलब है कि हर पंक्ति इस मान से बंद है। डायनमोबी में प्रत्येक पंक्ति में इस विशेषता के लिए एक आवश्यक, अद्वितीय मूल्य होगा । अनियंत्रित हैश इंडेक्स का अर्थ है कि क्या कहा जाता है - डेटा का आदेश नहीं दिया जाता है और आपको कोई गारंटी नहीं दी जाती है कि डेटा कैसे संग्रहीत किया जाता है। आप अनियंत्रित इंडेक्स पर प्रश्न नहीं बना पाएंगे जैसे मुझे उन सभी पंक्तियों को प्राप्त करें जिनके पास एक्स से अधिक एक ProductID है । आप हैश की के आधार पर आइटम लिखते और लाते हैं। उदाहरण के लिए, मुझे उस तालिका से पंक्ति प्राप्त करें जिसमें ProductID X है । आप एक अनियंत्रित इंडेक्स के खिलाफ एक क्वेरी कर रहे हैं, इसलिए आपके खिलाफ इसके मूल रूप से कुंजी-मूल्य लुकअप हैं, बहुत तेज़ हैं, और बहुत कम थ्रूपुट का उपयोग करते हैं।


हैश और रेंज प्राथमिक कुंजी - प्राथमिक कुंजी दो विशेषताओं से बनी है। पहली विशेषता हैश विशेषता है और दूसरी विशेषता रेंज विशेषता है। उदाहरण के लिए, फोरम थ्रेड तालिका में अपनी प्राथमिक कुंजी के रूप में फोरमनाम और विषय हो सकता है, जहां फोरमनाम हैश विशेषता है और विषय रेंज विशेषता है। DynamoDB हैश विशेषता पर एक अनियंत्रित हैश इंडेक्स बनाता है और रेंज विशेषता पर एक सॉर्ट किया गया रेंज इंडेक्स बनाता है।

इसका मतलब है कि हर पंक्ति की प्राथमिक कुंजी हैश और रेंज कुंजी का संयोजन है । यदि आपके पास हैश और रेंज कुंजी दोनों हैं, तो आप एकल पंक्तियों पर प्रत्यक्ष प्राप्त कर सकते हैं, या आप क्रमबद्ध सीमा सूचकांक के खिलाफ एक प्रश्न बना सकते हैं । उदाहरण के लिए, मुझे Hash कुंजी X वाली तालिका की सभी पंक्तियाँ प्राप्त करें जिनकी रेंज कुंजियाँ Y से अधिक हैं , या उस को प्रभावित करने वाले अन्य प्रश्न। जिन क्षेत्रों को अनुक्रमित नहीं किया गया है, उनके खिलाफ स्कैन और क्वेरी की तुलना में उनके पास बेहतर प्रदर्शन और कम क्षमता का उपयोग है। से अपनी दस्तावेज़ीकरण :

क्वेरी परिणाम हमेशा श्रेणी कुंजी द्वारा क्रमबद्ध किए जाते हैं। यदि श्रेणी कुंजी का डेटा प्रकार संख्या है, तो परिणाम संख्यात्मक क्रम में वापस आ जाते हैं; अन्यथा, परिणाम ASCII वर्ण कोड मानों के क्रम में लौटाए जाते हैं। डिफ़ॉल्ट रूप से, क्रम क्रम आरोही है। आदेश को उलटने के लिए, ScanIndexForward पैरामीटर को गलत पर सेट करें

मुझे शायद कुछ चीजें याद थीं क्योंकि मैंने इसे टाइप किया था और मैंने केवल सतह को खरोंच किया था। कर रहे हैं एक बहुत अधिक जब DynamoDB तालिकाओं के साथ काम करने को ध्यान में रखना करने के लिए पहलुओं (प्रवाह क्षमता, स्थिरता, क्षमता, अन्य सूचकांकों, कुंजी वितरण, आदि)। आपको उदाहरणों के लिए नमूना तालिकाओं और डेटा पृष्ठ पर एक नज़र डालनी चाहिए ।


53
यह सबसे उपयोगी स्टैक ओवरफ्लो उत्तरों में से एक है जो मैंने कभी पढ़ा है।
टॉमी

7
बिना हैश के केवल सीमा का उपयोग करने का कोई विकल्प क्यों नहीं है? उदाहरण के लिए, यदि मेरा सारा डेटा प्राथमिक कुंजी के रूप में उनके टाइमस्टैम्प के साथ संग्रहीत है, तो मैं "सभी डेटा को 2 और 4 बजे के बीच
10/15/2015 को

3
@Teofrostus, हैश कुंजी का उपयोग उस विभाजन को पहचानने के लिए किया जाता है जिसमें आइटम शामिल हैं। इसके बिना, डायनेमोडीबी किस विभाजन को नहीं देखेगा। यह जानने के लिए नहीं कि एक प्रश्न को पराजित करना कहाँ है, और यह स्कैन (या ग्लोबल सेकेंडरी इंडेक्स) के लिए उपयोग मामला है, लेकिन यह आपके उपयोग के मामले के लिए उपयुक्त नहीं है, बल्कि एक समय श्रृंखला का चयन करने के लिए डेटा)।
शेल्डन

1
@mkobit कोई भी तरीका है जिससे मैं स्कैन किए बिना विभाजन कुंजी दी गई सभी प्रकार की चाबियाँ प्राप्त कर सकता हूं?
अज्ञात

1
@ वीएनआर मुझे यकीन नहीं है कि मैं डायनमोफीडी के संदर्भ में आपके प्रश्न को समझ सकता हूं। क्या आप कह रहे हैं कि हैश कुंजी प्रदान करते समय सभी हैश + रेंज कुंजी प्राप्त करें?
मकोबित

19

जैसा कि पूरी चीज़ मिल रही है, आइए इसे देखने के लिए फ़ंक्शन और कोड को देखें कि इसका क्या अर्थ है

एक पंक्ति प्राप्त करने का एकमात्र तरीका प्राथमिक कुंजी है

getRow(pk: PrimaryKey): Row

प्राथमिक कुंजी डेटा संरचना यह हो सकती है:

// If you decide your primary key is just the partition key.
class PrimaryKey(partitionKey: String)

// and in thids case
getRow(somePartitionKey): Row

हालाँकि आप तय कर सकते हैं कि आपकी प्राथमिक कुंजी इस मामले में विभाजन कुंजी + सॉर्ट कुंजी है:

// if you decide your primary key is partition key + sort key
class PrimaryKey(partitionKey: String, sortKey: String)

getRow(partitionKey, sortKey): Row
getMultipleRows(partitionKey): Row[]

तो नीचे पंक्ति:

  1. निर्णय लिया कि आपकी प्राथमिक कुंजी केवल विभाजन कुंजी है? विभाजन कुंजी द्वारा एकल पंक्ति प्राप्त करें।

  2. निर्णय लिया कि आपकी प्राथमिक कुंजी विभाजन कुंजी + सॉर्ट कुंजी है? 2.1 (विभाजन कुंजी, सॉर्ट कुंजी) द्वारा एकल पंक्ति प्राप्त करें (विभाजन कुंजी) द्वारा पंक्तियों की श्रेणी प्राप्त करें

किसी भी तरह से आपको प्राथमिक कुंजी द्वारा एक पंक्ति मिलती है एकमात्र सवाल यह है कि क्या आपने परिभाषित किया है कि प्राथमिक कुंजी केवल विभाजन कुंजी या विभाजन कुंजी + प्रकार कुंजी है

बिल्डिंग ब्लॉक हैं:

  1. तालिका
  2. मद
  3. केवी गुण।

आइटम की पंक्ति के रूप में और KV पंक्ति में उस पंक्ति में कोशिकाओं के रूप में विशेषता के बारे में सोचें।

  1. आप प्राथमिक कुंजी द्वारा एक आइटम (एक पंक्ति) प्राप्त कर सकते हैं।
  2. आप (HashKey, RangeKeyQuery) निर्दिष्ट करके कई आइटम (कई पंक्तियाँ) प्राप्त कर सकते हैं

आप (2) केवल तभी कर सकते हैं जब आपने निर्णय लिया था कि आपका पीके (हैशके, सॉर्टकेय) से बना है।

इसके परिसर के रूप में अधिक नेत्रहीन, जिस तरह से मैं इसे देखता हूं:

+----------------------------------------------------------------------------------+
|Table                                                                             |
|+------------------------------------------------------------------------------+  |
||Item                                                                          |  |
||+-----------+ +-----------+ +-----------+ +-----------+                       |  |
|||primaryKey | |kv attr    | |kv attr ...| |kv attr ...|                       |  |
||+-----------+ +-----------+ +-----------+ +-----------+                       |  |
|+------------------------------------------------------------------------------+  |
|+------------------------------------------------------------------------------+  |
||Item                                                                          |  |
||+-----------+ +-----------+ +-----------+ +-----------+ +-----------+         |  |
|||primaryKey | |kv attr    | |kv attr ...| |kv attr ...| |kv attr ...|         |  |
||+-----------+ +-----------+ +-----------+ +-----------+ +-----------+         |  |
|+------------------------------------------------------------------------------+  |
|                                                                                  |
+----------------------------------------------------------------------------------+

+----------------------------------------------------------------------------------+
|1. Always get item by PrimaryKey                                                  |
|2. PK is (Hash,RangeKey), great get MULTIPLE Items by Hash, filter/sort by range     |
|3. PK is HashKey: just get a SINGLE ITEM by hashKey                               |
|                                                      +--------------------------+|
|                                 +---------------+    |getByPK => getBy(1        ||
|                 +-----------+ +>|(HashKey,Range)|--->|hashKey, > < or startWith ||
|              +->|Composite  |-+ +---------------+    |of rangeKeys)             ||
|              |  +-----------+                        +--------------------------+|
|+-----------+ |                                                                   |
||PrimaryKey |-+                                                                   |
|+-----------+ |                                       +--------------------------+|
|              |  +-----------+   +---------------+    |getByPK => get by specific||
|              +->|HashType   |-->|get one item   |--->|hashKey                   ||
|                 +-----------+   +---------------+    |                          ||
|                                                      +--------------------------+|
+----------------------------------------------------------------------------------+

तो ऊपर जो हो रहा है। निम्नलिखित टिप्पणियों पर ध्यान दें। जैसा कि हमने कहा कि हमारा डेटा (तालिका, आइटम, KVAttribute) से संबंधित है। फिर हर आइटम में एक प्राथमिक कुंजी होती है। अब जिस तरह से आप लिखते हैं कि प्राथमिक कुंजी सार्थक है कि आप डेटा तक कैसे पहुँच सकते हैं।

यदि आप यह तय करते हैं कि आपका प्राइमरीकेई एक हैश कुंजी है, तो महान आप इसमें से एक भी आइटम प्राप्त कर सकते हैं। यदि आप यह तय करते हैं कि आपकी प्राथमिक कुंजी hashKey + SortKey है तो आप अपनी प्राथमिक कुंजी पर एक श्रेणी क्वेरी भी कर सकते हैं क्योंकि आपको अपने आइटम (HashKey + SomeRangeFunction (रेंज कुंजी पर)) मिल जाएंगे। तो आप अपनी प्राथमिक कुंजी क्वेरी के साथ कई आइटम प्राप्त कर सकते हैं।

नोट: मैंने द्वितीयक अनुक्रमणिका का उल्लेख नहीं किया है।


4

एक अच्छी तरह से समझाया गया उत्तर पहले से ही @mkobit द्वारा दिया गया है, लेकिन मैं रेंज कुंजी और हैश कुंजी की एक बड़ी तस्वीर जोड़ूंगा।

एक सरल शब्दों में range + hash key = composite primary key डायनमॉडब के कोरकंप्यूटर यहां छवि विवरण दर्ज करें

एक प्राथमिक कुंजी में एक हैश कुंजी और एक वैकल्पिक श्रेणी कुंजी होती है। हैम की का उपयोग डायनमोडीबी विभाजन का चयन करने के लिए किया जाता है। विभाजन तालिका डेटा के भाग हैं। विभाजन कुंजी का उपयोग विभाजन में आइटम को सॉर्ट करने के लिए किया जाता है, यदि वे मौजूद हैं।

इसलिए दोनों का एक अलग उद्देश्य है और साथ में जटिल क्वेरी करने में मदद करते हैं। उपरोक्त उदाहरण hashkey1 can have multiple n-range.में रेंज और हैशेक का एक और उदाहरण गेम, यूजरए है(hashkey) सकता है(range)

यहां छवि विवरण दर्ज करें

टेबल्स, आइटम, और विशेषताओं में वर्णित संगीत तालिका एक तालिका का एक उदाहरण है, जिसमें एक समग्र प्राथमिक कुंजी (कलाकार और सोंगटेबल) है। आप संगीत तालिका में किसी भी आइटम को सीधे एक्सेस कर सकते हैं, यदि आप उस आइटम के लिए आर्टिस्ट और सॉन्गिटल मान प्रदान करते हैं।

डेटा की क्वेरी करते समय एक समग्र प्राथमिक कुंजी आपको अतिरिक्त लचीलापन देती है। उदाहरण के लिए, यदि आप केवल कलाकार के लिए मूल्य प्रदान करते हैं, तो DynamoDB उस कलाकार के सभी गीतों को पुनः प्राप्त करता है। किसी विशेष कलाकार द्वारा केवल गाने के एक सबसेट को पुनः प्राप्त करने के लिए, आप SongTitle के लिए मानों की एक श्रृंखला के साथ कलाकार के लिए एक मूल्य प्रदान कर सकते हैं।

यहां छवि विवरण दर्ज करें

https://www.slideshare.net/InfoQ/amazon-dynamodb-design-patterns-best-practices https://www.slideshare.net/AmazonWebServices/awsome-day-2016-module-4-databases-amazon-dynamodb -और-amazon- rds https://ceyhunozgun.blogspot.com/2017/04/implementing-object-persistence-with-dynamodb.html


उदाहरण के लिए Musicटेबल के साथ एक कलाकार एक ही शीर्षक के साथ दो गाने नहीं बना सकता है, लेकिन आश्चर्य - वीडियो गेम में हमारे पास 1993 से कयामत और 2016 से कयामत है। एक ही कलाकार के साथ en.wikipedia.org/wiki/Doom_(franchise) ( डेवलपर) id Software:।
विटाली ज़डनेविच

0

@ जनाब आप केवल पार्टीशन कीज का उपयोग करके विभाजन कुंजी के साथ जुड़े सभी प्रकार की कुंजियों को पुनः प्राप्त कर सकते हैं। स्कैन की जरूरत नहीं। यहां बिंदु एक क्वेरी में विभाजन कुंजी अनिवार्य है। सॉर्ट कुंजी का उपयोग केवल डेटा की श्रेणी प्राप्त करने के लिए किया जाता है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.