कैसेंड्रा में विभाजन कुंजी, समग्र कुंजी और क्लस्टरिंग कुंजी के बीच अंतर?


522

मैं निम्नलिखित keyप्रकारों के बीच के अंतर को समझने के लिए नेट पर लेख पढ़ रहा हूं । लेकिन मुझे समझाना मुश्किल है। उदाहरण निश्चित रूप से समझ को बेहतर बनाने में मदद करेंगे।

primary key,
partition key, 
composite key 
clustering key

22
मुझे यह लेख मिला जिसमें इन अवधारणाओं के आसपास कई विस्तृत स्पष्टीकरण शामिल हैं।
mynkow

यह लेख भी स्पष्ट रूप से इन शर्तों को इंगित करता है।
डुओंग_डाज्जा १४'१६ को

आपके द्वारा साझा किया गया @duong_dajgja URL टूट गया है, क्या आप कृपया मान्य / उपयोगी URL के साथ टिप्पणी संपादित कर सकते हैं?
realPK

@realPK लिंक किसी तरह चला गया है। लेकिन मुझे यहाँ आपके लिए एक और लिंक मिला quora.com/…
डुओंग_डाज्जा

जवाबों:


1170

इसके चारों ओर बहुत भ्रम है, मैं इसे यथासंभव सरल बनाने की कोशिश करूंगा।

प्राथमिक कुंजी एक सामान्य अवधारणा है जो तालिका से डेटा पुनर्प्राप्त करने के लिए उपयोग किए जाने वाले एक या अधिक स्तंभों को इंगित करती है।

प्राथमिक कुंजी सरल हो सकती है और यहां तक ​​कि इनलाइन भी घोषित की जा सकती है :

 create table stackoverflow_simple (
      key text PRIMARY KEY,
      data text      
  );

इसका मतलब है कि यह एक सिंगल कॉलम द्वारा बनाया गया है।

लेकिन अधिक स्तंभों से उत्पन्न प्राथमिक कुंजी COMPOSITE (उर्फ COMPOUND ) भी हो सकती है ।

 create table stackoverflow_composite (
      key_part_one text,
      key_part_two int,
      data text,
      PRIMARY KEY(key_part_one, key_part_two)      
  );

की स्थिति में समग्र प्राथमिक कुंजी, कुंजी "पहले भाग" कहा जाता है PARTITION कुंजी (इस उदाहरण में key_part_one है विभाजन कुंजी) और चाबी के दूसरे भाग है क्लस्टरिंग कुंजी (इस उदाहरण में key_part_two )

कृपया ध्यान दें कि विभाजन और क्लस्टरिंग कुंजी दोनों को अधिक कॉलम द्वारा बनाया जा सकता है , यहां बताया गया है:

 create table stackoverflow_multiple (
      k_part_one text,
      k_part_two int,
      k_clust_one text,
      k_clust_two int,
      k_clust_three uuid,
      data text,
      PRIMARY KEY((k_part_one, k_part_two), k_clust_one, k_clust_two, k_clust_three)      
  );

इन नामों के पीछे ...

  • विभाजन कुंजी अपने नोड्स भर में डेटा वितरण के लिए जिम्मेदार है।
  • क्लस्टरिंग कुंजी विभाजन के भीतर छँटाई डेटा के लिए जिम्मेदार है।
  • प्राथमिक कुंजी के बराबर है विभाजन कुंजी एक एकल क्षेत्र कुंजी तालिका (यानी में सरल )।
  • कम्पोजिट / यौगिक कुंजी बस किसी भी बहु-स्तंभ की कुंजी है

आगे की उपयोग जानकारी: DATASTAX DOCUMENTATION


छोटे उपयोग और सामग्री के उदाहरण
सरल कुंजी:

insert into stackoverflow_simple (key, data) VALUES ('han', 'solo');
select * from stackoverflow_simple where key='han';

तालिका सामग्री

key | data
----+------
han | solo

COMPOSITE / COMPOUND कुंजी "विस्तृत पंक्तियों" को पुनः प्राप्त कर सकती है (यानी आप केवल विभाजन कुंजी द्वारा क्वेरी कर सकते हैं, भले ही आपके पास क्लस्टरिंग कुंजी परिभाषित हो)

insert into stackoverflow_composite (key_part_one, key_part_two, data) VALUES ('ronaldo', 9, 'football player');
insert into stackoverflow_composite (key_part_one, key_part_two, data) VALUES ('ronaldo', 10, 'ex-football player');
select * from stackoverflow_composite where key_part_one = 'ronaldo';

तालिका सामग्री

 key_part_one | key_part_two | data
--------------+--------------+--------------------
      ronaldo |            9 |    football player
      ronaldo |           10 | ex-football player

लेकिन आप सभी कुंजी (दोनों विभाजन और क्लस्टरिंग) के साथ क्वेरी कर सकते हैं ...

select * from stackoverflow_composite 
   where key_part_one = 'ronaldo' and key_part_two  = 10;

क्वेरी आउटपुट

 key_part_one | key_part_two | data
--------------+--------------+--------------------
      ronaldo |           10 | ex-football player

महत्वपूर्ण नोट: विभाजन कुंजी एक का उपयोग करके क्वेरी करने के लिए आवश्यक न्यूनतम-निर्दिष्ट है where clause। यदि आपके पास एक कंपोजिट विभाजन कुंजी है, तो निम्न की तरह

उदाहरण के लिए: PRIMARY KEY((col1, col2), col10, col4))

आप केवल कम से कम col1 और col2 दोनों पास करके क्वेरी कर सकते हैं, ये 2 कॉलम हैं जो विभाजन कुंजी को परिभाषित करते हैं। क्वेरी करने के लिए "सामान्य" नियम यह है कि आपको कम से कम सभी विभाजन कुंजी कॉलम पास करने होंगे, फिर आप क्रम में प्रत्येक क्लस्टरिंग कुंजी को उनके द्वारा सेट किए गए जोड़ सकते हैं।

इसलिए वैध प्रश्न हैं ( द्वितीयक सूचकांक को छोड़कर )

  • col1 और col2
  • col1 और col2 और col10
  • col1 और col2 और col10 और col 4

अमान्य:

  • col1 और col2 और col4
  • कुछ भी जिसमें col1 और col2 दोनों शामिल नहीं हैं

उम्मीद है की यह मदद करेगा।


7
जैसा कि मैंने लिखा है - << क्वेरी बनाने के लिए "सामान्य" नियम यह है कि आपको कम से कम सभी विभाजन कुंजी कॉलम को पास करना होगा, फिर आप प्रत्येक कुंजी को उस क्रम में जोड़ सकते हैं जो वे सेट कर रहे हैं। >> - चूंकि कॉल 10 को पहले परिभाषित किया गया है। col4 आपको इसे col4
Carlo Bertuccini

2
आप द्वितीयक सूचकांक जोड़ सकते हैं लेकिन इसका मतलब यह नहीं है कि आप "किसी भी" cql क्वेरी को निष्पादित कर सकते हैं - और अधिक: एक माध्यमिक सूचकांक बनाने से पहले आपको 10 ... 000 ..... तक गिनती करनी चाहिए
कार्लो बर्टुकिनी

2
माध्यमिक इंडेक्स को स्थानीय इंडेक्स के रूप में लागू किया जाता है - उन्हें क्लस्टर में वितरित नहीं किया जाता है। क्लस्टर का प्रत्येक नोड इसके स्वामित्व वाले डेटा के द्वितीयक अनुक्रमितों को संग्रहीत करने के लिए जिम्मेदार है। इस कारण से sec.index पर एक क्वेरी क्लस्टर में सभी नोड्स को शामिल कर सकती है
कार्लो बर्टुकिनी

5
यह मुझे कुछ दिनों के लिए उलझन में था, इस उत्तर के लिए धन्यवाद, अब मैं अपने सिर में डेटा मॉडल बनाने में सक्षम हूं।
रोजर डवान

2
वाह। आपने मुझे घंटों या दिनों में बचाया! धन्यवाद, शानदार व्याख्या।
आंद्रे गार्सिया

128

स्वीकृत उत्तर के रूप में सारांश उत्तर जोड़ना काफी लंबा है। "पंक्ति" और "कॉलम" शब्द CQL के संदर्भ में उपयोग किए जाते हैं, न कि कैसे कैसंड्रा वास्तव में कार्यान्वित किया जाता है।

  • एक प्राथमिक कुंजी विशिष्ट एक पंक्ति को पहचानती है।
  • एक समग्र कुंजी कई स्तंभों से बनाई गई एक कुंजी है।
  • एक विभाजन कुंजी , पंक्तियों का एक सेट को खोजने के लिए एक विभाजन यानी प्राथमिक देखने है।
  • एक क्लस्टरिंग कुंजी प्राथमिक कुंजी है कि विभाजन कुंजी नहीं है (और एक विभाजन के भीतर आदेश को परिभाषित करता है) का हिस्सा है।

उदाहरण:

  • PRIMARY KEY (a): विभाजन कुंजी है a
  • PRIMARY KEY (a, b): विभाजन कुंजी है a, क्लस्टरिंग कुंजी है b
  • PRIMARY KEY ((a, b)): कंपोजिट विभाजन कुंजी है (a, b)
  • PRIMARY KEY (a, b, c): विभाजन कुंजी है a, मिश्रित क्लस्टरिंग कुंजी है (b, c)
  • PRIMARY KEY ((a, b), c): कंपोजिट पार्टीशन कुंजी है (a, b), क्लस्टरिंग कुंजी है c
  • PRIMARY KEY ((a, b), c, d): कंपोजिट विभाजन कुंजी है (a, b), कंपोजिट क्लस्टरिंग कुंजी है (c, d)

15

कैसंड्रा में, प्राथमिक कुंजी, विभाजन कुंजी, समग्र कुंजी, क्लस्टरिंग कुंजी के बीच का अंतर हमेशा कुछ भ्रम पैदा करता है .. इसलिए मैं नीचे व्याख्या करने जा रहा हूं और एक-दूसरे से संबंधित हूं। हम कैसंड्रा डेटाबेस एक्सेस के लिए CQL (कैसेंड्रा क्वेरी लैंग्वेज) का उपयोग करते हैं। नोट: - उत्तर कैसेंड्रा के अद्यतन संस्करण के अनुसार है। प्राथमिक कुंजी :-

कैसंड्रा में प्राथमिक कुंजी का उपयोग करने के 2 अलग-अलग तरीके हैं।

CREATE TABLE Cass (
    id int PRIMARY KEY,
    name text 
);

Create Table Cass (
   id int,
   name text,
   PRIMARY KEY(id) 
);

CQL में, वह क्रम जिसमें कॉलम PRIMARY KEY मामलों के लिए परिभाषित किया गया है। कुंजी के पहले कॉलम को विभाजन कुंजी कहा जाता है जिसमें संपत्ति होती है जो समान विभाजन कुंजी (यहां तक ​​कि वास्तव में तालिका के पार) साझा करने वाली सभी पंक्तियों को एक ही भौतिक नोड पर संग्रहीत किया जाता है। इसके अलावा, दी गई तालिका के लिए समान विभाजन कुंजी साझा करने वाली पंक्तियों पर सम्मिलन / अद्यतन / विलोपन को परमाणु और अलगाव में किया जाता है। ध्यान दें कि कंपोजिट कुंजी बनाने के लिए कोष्ठक के अतिरिक्त सेट का उपयोग करके एक कंपोजिट पार्टीशन कुंजी, यानी एक विभाजन कुंजी कई कॉलमों से बनी होती है।

विभाजन और क्लस्टरिंग प्रधान कुंजी परिभाषा दो भागों से बनी है: विभाजन कुंजी और क्लस्टरिंग कॉलम। पहला भाग स्टोरेज इंजन पंक्ति कुंजी के लिए मैप करता है, जबकि दूसरा एक पंक्ति में स्तंभों के समूह के लिए उपयोग किया जाता है।

CREATE TABLE device_check (
  device_id   int,
  checked_at  timestamp,
  is_power    boolean,
  is_locked   boolean,
  PRIMARY KEY (device_id, checked_at)
);

यहाँ device_id विभाजन कुंजी है और check_at क्लस्टर_की है।

हमारे पास कई क्लस्टर कुंजी और साथ ही विभाजन कुंजी भी हो सकती है जो घोषणा पर निर्भर करती है।


6
आप अपने स्रोतों को कुछ श्रेय दे सकते हैं (2013 = अपने पद से अधिक पुराने): thelastpickle.com/blog/2013/01/11/primary-keys-in-cql.html
क्रिस्टोफ़

11

प्राथमिक कुंजी : विभाजन कुंजी से बना है [और वैकल्पिक क्लस्टरिंग कुंजी (या कॉलम)]
विभाजन कुंजी : विभाजन कुंजी का हैश मान डेटा
क्लस्टरिंग कुंजी संग्रहीत करने के लिए क्लस्टर में विशिष्ट नोड निर्धारित करने के लिए उपयोग किया जाता है: प्रत्येक विभाजन में डेटा को सॉर्ट करें (या जिम्मेदार नोड और यह प्रतिकृतियां है)

यौगिक प्राथमिक कुंजी : जैसा कि ऊपर कहा गया है, प्राथमिक कुंजी में क्लस्टरिंग कुंजी वैकल्पिक हैं। यदि उनका उल्लेख नहीं किया जाता है, तो यह एक साधारण प्राथमिक कुंजी है। यदि क्लस्टरिंग कुंजी का उल्लेख किया जाता है, तो यह एक कंपाउंड प्राथमिक कुंजी है।

समग्र विभाजन कुंजी : विभाजन कुंजी के रूप में सिर्फ एक कॉलम का उपयोग करने से, विस्तृत पंक्ति समस्याओं (डेटा का उपयोग / डेटा मॉडलिंग पर निर्भर करता है) हो सकता है। इसलिए विभाजन कुंजी को कभी-कभी एक से अधिक कॉलम के संयोजन के रूप में निर्दिष्ट किया जाता है।

भ्रम के बारे में जिसमें से एक अनिवार्य है , जिसे एक प्रश्न में छोड़ दिया जा सकता है इत्यादि, कैसेंड्रा की कल्पना करने की कोशिश कर रहा है क्योंकि एक विशालकाय HMapMap मदद करता है। तो एक HashMap में, आप कुंजी के बिना मूल्यों को पुनः प्राप्त नहीं कर सकते।
यहां, विभाजन कुंजी उस कुंजी की भूमिका निभाती है। इसलिए प्रत्येक क्वेरी को उन्हें निर्दिष्ट करने की आवश्यकता है। जिसके बिना कैसेंड्रा को पता नहीं होगा कि किस नोड को खोजना है। क्लस्टरिंग कुंजी (स्तंभों, जो वैकल्पिक हैं) आगे आपकी क्वेरी खोज को सीमित करने के बाद कैसेंड्रा विशिष्ट नोड पता चल गया है (और यह की प्रतिकृतियां) में मदद कि विशिष्ट के लिए जिम्मेदार विभाजन कुंजी


5

संक्षिप्त अर्थ में:

विभाजन कुंजी एक पंक्ति के लिए पहचान के अलावा कुछ भी नहीं है , कि अधिकांश समय की पहचान एकल स्तंभ ( प्राथमिक कुंजी कहा जाता है ) कभी-कभी कई स्तंभों का संयोजन होता है ( समग्र विभाजन कुंजी कहा जाता है )।

क्लस्टर कुंजी इंडेक्सिंग और सॉर्टिंग के अलावा और कुछ नहीं है । क्लस्टर कुंजियाँ कुछ बातों पर निर्भर करती हैं:

  1. प्राथमिक कुंजी स्तंभों को छोड़कर आप किन कॉलमों का उपयोग करते हैं

  2. यदि आपके पास बहुत बड़े रिकॉर्ड हैं तो किस चिंता पर मैं आसान प्रबंधन के लिए तारीख को विभाजित कर सकता हूं। उदाहरण के लिए, मेरे पास 1million एक काउंटी जनसंख्या रिकॉर्ड है। इसलिए आसान प्रबंधन के लिए, मैं राज्य और पिनकोड और इतने पर के आधार पर डेटा क्लस्टर करता हूं।


3
विभाजन कुंजी A पंक्ति की पहचान नहीं है ... यह उन सभी पंक्तियों के एक समूह की पहचान करती है जिनमें समान विभाजन कुंजी है
wmac

1

ध्यान देने योग्य बात, आप शायद उन बहुतों का उपयोग संबंधपरक दुनिया (समान कुंजी) में समान अवधारणाओं की तुलना में अधिक करेंगे।

उदाहरण - मान लीजिए कि आपको अंतिम एन उपयोगकर्ताओं को ढूंढना है जो हाल ही में उपयोगकर्ता समूह एक्स में शामिल हुए हैं। आप इस कुशलता से दिए गए रीड को इस मामले में प्रमुख कैसे करेंगे? उस तरह (आधिकारिक कैसेंड्रा गाइड से ):

CREATE TABLE group_join_dates (
    groupname text,
    joined timeuuid,
    join_date text,
    username text,
    email text,
    age int,
    PRIMARY KEY ((groupname, join_date), joined)
) WITH CLUSTERING ORDER BY (joined DESC)

यहां, विभाजन कुंजी स्वयं कंपाउंड है और क्लस्टरिंग कुंजी एक सम्मिलित तिथि है। क्‍लस्‍टरिंग क्‍यूट क्‍यूं होने की वजह यह है कि परिणाम पहले ही छांट लिए जाते हैं (और संग्रहीत किया जाता है, जिससे लुकअप तेजी से होता है)। लेकिन हम कुंजी विभाजन के लिए एक यौगिक कुंजी का उपयोग क्यों करते हैं ? क्योंकि हम हमेशा संभव के रूप में कुछ विभाजन पढ़ना चाहते हैं । कैसे join_date को वहाँ रखने में मदद करता है? अब एक ही समूह के उपयोगकर्ता और एक ही ज्वाइन डेट एक ही पार्टीशन में रहेंगे! इसका मतलब है कि हम हमेशा संभव के रूप में कुछ विभाजनों को पढ़ेंगे (पहले नए के साथ शुरू करें, फिर पुराने और इतने पर आगे बढ़ें, बजाय इसके कि आप कूदें)।

वास्तव में, चरम मामलों में आपको भी हैश का उपयोग करने की आवश्यकता होगी join_date एक के बजाय join_date कि यदि आप पिछले 3 दिनों के लिए क्वेरी अक्सर उन शेयर एक ही हैश और इसलिए एक ही विभाजन से उपलब्ध हैं - अकेले!


0

कैसंड्रा में प्राथमिक कुंजी में आमतौर पर दो भाग होते हैं - विभाजन कुंजी और क्लस्टरिंग कॉलम।

प्राथमिक_की ((विभाजन_की), क्लस्टरिंग_कोल)

विभाजन कुंजी - प्राथमिक कुंजी का पहला भाग। एक विभाजन कुंजी का मुख्य उद्देश्य नोड की पहचान करना है जो विशेष पंक्ति को संग्रहीत करता है।

रचना TABLE_

यहाँ, (phone_num, नाम) विभाजन कुंजी है। डेटा सम्मिलित करते समय, विभाजन कुंजी का हैश मान उत्पन्न होता है और यह मान तय करता है कि पंक्ति को किस नोड में जाना चाहिए।

4 नोड क्लस्टर पर विचार करें, प्रत्येक नोड में कई हैश मान हैं जो इसे स्टोर कर सकते हैं। (लिखें) INSERT INTO phone_book VALUES (7826573732, 'जॉय', 25, 'न्यूयॉर्क');

अब, विभाजन कुंजी का हैश मान कैसंड्रा पार्टीशनर द्वारा गणना किया जाता है। कहते हैं, हैश मान (7826573732, 'जॉय') → 12, अब, यह पंक्ति NN C में डाली जाएगी।

(पढ़ें) SELECT * FROM phone_book WHERE phone_num = 7826573732 और नाम = 'जॉय';

अब, फिर से विभाजन कुंजी के हैश मान (7826573732, 'जॉय') की गणना की जाती है, जो हमारे मामले में 12 है जो नोड सी में रहता है, जिसमें से रीड किया जाता है।

  1. क्लस्टरिंग कॉलम - प्राथमिक कुंजी का दूसरा भाग। क्लस्टरिंग कॉलम होने का मुख्य उद्देश्य डेटा को क्रमबद्ध क्रम में संग्रहित करना है। डिफ़ॉल्ट रूप से, क्रम आरोही है।

आपके द्वारा हल की जा रही क्वेरी के आधार पर एक प्राथमिक कुंजी में एक से अधिक विभाजन कुंजी और क्लस्टरिंग कॉलम हो सकते हैं।

प्राथमिक_की ((pk1, pk2), col 1, col2)


-3

डेटाबेस डिजाइन में, एक यौगिक कुंजी सुपरकी का एक सेट है जो न्यूनतम नहीं है।

एक संयुक्त कुंजी एक सेट है जिसमें एक यौगिक कुंजी होती है और कम से कम एक विशेषता होती है जो सुपरकी नहीं होती है

दी गई तालिका: EMPLOYEES {employee_id, firstname, surname}

संभव सुपरकिंग्स हैं:

{employee_id}
{employee_id, firstname}
{employee_id, firstname, surname}

{employee_id} एकमात्र न्यूनतम सुपरकी है, जो इसे एकमात्र उम्मीदवार कुंजी बनाता है - यह देखते हुए कि {firstname} और {surname} विशिष्टता की गारंटी नहीं देते हैं। चूंकि प्राथमिक कुंजी को एक चुने हुए उम्मीदवार कुंजी के रूप में परिभाषित किया गया है, और इस उदाहरण में केवल एक उम्मीदवार कुंजी मौजूद है, {कर्मचारी_आईडी} न्यूनतम सुपरकी, एकमात्र उम्मीदवार कुंजी और एकमात्र संभव प्राथमिक कुंजी है।

यौगिक कुंजियों की विस्तृत सूची है:

{employee_id, firstname}
{employee_id, surname}
{employee_id, firstname, surname}

एकमात्र मिश्रित कुंजी {कर्मचारी_आईडी, फर्स्टनाम, सरनेम} है क्योंकि उस कुंजी में एक कंपाउंड कुंजी ({कर्मचारी_आईडी, फर्स्टनाम}) और एक विशेषता है जो एक सुपरकी ({उपनाम}) नहीं है।


सवाल पूछने के लिए पूरी तरह अप्रासंगिक। कृपया कासांद्रा के संदर्भ में पूछी गई कुंजियों के उत्तर को संपादित करें, न कि सामान्य विवरण। स्व।
RealPK
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.