मैं निम्नलिखित key
प्रकारों के बीच के अंतर को समझने के लिए नेट पर लेख पढ़ रहा हूं । लेकिन मुझे समझाना मुश्किल है। उदाहरण निश्चित रूप से समझ को बेहतर बनाने में मदद करेंगे।
primary key,
partition key,
composite key
clustering key
मैं निम्नलिखित key
प्रकारों के बीच के अंतर को समझने के लिए नेट पर लेख पढ़ रहा हूं । लेकिन मुझे समझाना मुश्किल है। उदाहरण निश्चित रूप से समझ को बेहतर बनाने में मदद करेंगे।
primary key,
partition key,
composite key
clustering key
जवाबों:
इसके चारों ओर बहुत भ्रम है, मैं इसे यथासंभव सरल बनाने की कोशिश करूंगा।
प्राथमिक कुंजी एक सामान्य अवधारणा है जो तालिका से डेटा पुनर्प्राप्त करने के लिए उपयोग किए जाने वाले एक या अधिक स्तंभों को इंगित करती है।
प्राथमिक कुंजी सरल हो सकती है और यहां तक कि इनलाइन भी घोषित की जा सकती है :
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 कॉलम हैं जो विभाजन कुंजी को परिभाषित करते हैं। क्वेरी करने के लिए "सामान्य" नियम यह है कि आपको कम से कम सभी विभाजन कुंजी कॉलम पास करने होंगे, फिर आप क्रम में प्रत्येक क्लस्टरिंग कुंजी को उनके द्वारा सेट किए गए जोड़ सकते हैं।
इसलिए वैध प्रश्न हैं ( द्वितीयक सूचकांक को छोड़कर )
अमान्य:
उम्मीद है की यह मदद करेगा।
स्वीकृत उत्तर के रूप में सारांश उत्तर जोड़ना काफी लंबा है। "पंक्ति" और "कॉलम" शब्द 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)
।कैसंड्रा में, प्राथमिक कुंजी, विभाजन कुंजी, समग्र कुंजी, क्लस्टरिंग कुंजी के बीच का अंतर हमेशा कुछ भ्रम पैदा करता है .. इसलिए मैं नीचे व्याख्या करने जा रहा हूं और एक-दूसरे से संबंधित हूं। हम कैसंड्रा डेटाबेस एक्सेस के लिए CQL (कैसेंड्रा क्वेरी लैंग्वेज) का उपयोग करते हैं। नोट: - उत्तर कैसेंड्रा के अद्यतन संस्करण के अनुसार है। प्राथमिक कुंजी :-
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 क्लस्टर_की है।
हमारे पास कई क्लस्टर कुंजी और साथ ही विभाजन कुंजी भी हो सकती है जो घोषणा पर निर्भर करती है।
प्राथमिक कुंजी : विभाजन कुंजी से बना है [और वैकल्पिक क्लस्टरिंग कुंजी (या कॉलम)]
विभाजन कुंजी : विभाजन कुंजी का हैश मान डेटा
क्लस्टरिंग कुंजी संग्रहीत करने के लिए क्लस्टर में विशिष्ट नोड निर्धारित करने के लिए उपयोग किया जाता है: प्रत्येक विभाजन में डेटा को सॉर्ट करें (या जिम्मेदार नोड और यह प्रतिकृतियां है)
यौगिक प्राथमिक कुंजी : जैसा कि ऊपर कहा गया है, प्राथमिक कुंजी में क्लस्टरिंग कुंजी वैकल्पिक हैं। यदि उनका उल्लेख नहीं किया जाता है, तो यह एक साधारण प्राथमिक कुंजी है। यदि क्लस्टरिंग कुंजी का उल्लेख किया जाता है, तो यह एक कंपाउंड प्राथमिक कुंजी है।
समग्र विभाजन कुंजी : विभाजन कुंजी के रूप में सिर्फ एक कॉलम का उपयोग करने से, विस्तृत पंक्ति समस्याओं (डेटा का उपयोग / डेटा मॉडलिंग पर निर्भर करता है) हो सकता है। इसलिए विभाजन कुंजी को कभी-कभी एक से अधिक कॉलम के संयोजन के रूप में निर्दिष्ट किया जाता है।
भ्रम के बारे में जिसमें से एक अनिवार्य है , जिसे एक प्रश्न में छोड़ दिया जा सकता है इत्यादि, कैसेंड्रा की कल्पना करने की कोशिश कर रहा है क्योंकि एक विशालकाय HMapMap मदद करता है। तो एक HashMap में, आप कुंजी के बिना मूल्यों को पुनः प्राप्त नहीं कर सकते।
यहां, विभाजन कुंजी उस कुंजी की भूमिका निभाती है। इसलिए प्रत्येक क्वेरी को उन्हें निर्दिष्ट करने की आवश्यकता है। जिसके बिना कैसेंड्रा को पता नहीं होगा कि किस नोड को खोजना है। क्लस्टरिंग कुंजी (स्तंभों, जो वैकल्पिक हैं) आगे आपकी क्वेरी खोज को सीमित करने के बाद कैसेंड्रा विशिष्ट नोड पता चल गया है (और यह की प्रतिकृतियां) में मदद कि विशिष्ट के लिए जिम्मेदार विभाजन कुंजी ।
संक्षिप्त अर्थ में:
विभाजन कुंजी एक पंक्ति के लिए पहचान के अलावा कुछ भी नहीं है , कि अधिकांश समय की पहचान एकल स्तंभ ( प्राथमिक कुंजी कहा जाता है ) कभी-कभी कई स्तंभों का संयोजन होता है ( समग्र विभाजन कुंजी कहा जाता है )।
क्लस्टर कुंजी इंडेक्सिंग और सॉर्टिंग के अलावा और कुछ नहीं है । क्लस्टर कुंजियाँ कुछ बातों पर निर्भर करती हैं:
प्राथमिक कुंजी स्तंभों को छोड़कर आप किन कॉलमों का उपयोग करते हैं
यदि आपके पास बहुत बड़े रिकॉर्ड हैं तो किस चिंता पर मैं आसान प्रबंधन के लिए तारीख को विभाजित कर सकता हूं। उदाहरण के लिए, मेरे पास 1million एक काउंटी जनसंख्या रिकॉर्ड है। इसलिए आसान प्रबंधन के लिए, मैं राज्य और पिनकोड और इतने पर के आधार पर डेटा क्लस्टर करता हूं।
ध्यान देने योग्य बात, आप शायद उन बहुतों का उपयोग संबंधपरक दुनिया (समान कुंजी) में समान अवधारणाओं की तुलना में अधिक करेंगे।
उदाहरण - मान लीजिए कि आपको अंतिम एन उपयोगकर्ताओं को ढूंढना है जो हाल ही में उपयोगकर्ता समूह एक्स में शामिल हुए हैं। आप इस कुशलता से दिए गए रीड को इस मामले में प्रमुख कैसे करेंगे? उस तरह (आधिकारिक कैसेंड्रा गाइड से ):
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 दिनों के लिए क्वेरी अक्सर उन शेयर एक ही हैश और इसलिए एक ही विभाजन से उपलब्ध हैं - अकेले!
कैसंड्रा में प्राथमिक कुंजी में आमतौर पर दो भाग होते हैं - विभाजन कुंजी और क्लस्टरिंग कॉलम।
प्राथमिक_की ((विभाजन_की), क्लस्टरिंग_कोल)
विभाजन कुंजी - प्राथमिक कुंजी का पहला भाग। एक विभाजन कुंजी का मुख्य उद्देश्य नोड की पहचान करना है जो विशेष पंक्ति को संग्रहीत करता है।
रचना 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 है जो नोड सी में रहता है, जिसमें से रीड किया जाता है।
आपके द्वारा हल की जा रही क्वेरी के आधार पर एक प्राथमिक कुंजी में एक से अधिक विभाजन कुंजी और क्लस्टरिंग कॉलम हो सकते हैं।
प्राथमिक_की ((pk1, pk2), col 1, col2)
डेटाबेस डिजाइन में, एक यौगिक कुंजी सुपरकी का एक सेट है जो न्यूनतम नहीं है।
एक संयुक्त कुंजी एक सेट है जिसमें एक यौगिक कुंजी होती है और कम से कम एक विशेषता होती है जो सुपरकी नहीं होती है
दी गई तालिका: 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}
एकमात्र मिश्रित कुंजी {कर्मचारी_आईडी, फर्स्टनाम, सरनेम} है क्योंकि उस कुंजी में एक कंपाउंड कुंजी ({कर्मचारी_आईडी, फर्स्टनाम}) और एक विशेषता है जो एक सुपरकी ({उपनाम}) नहीं है।