2014-10-17 14 views
6

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

फ़ीड तालिका:

CREATE TABLE my_feed (
    tenant_id int, 
    item_id int, 
    created_at timestamp, 
    feed_data text, 
PRIMARY KEY (tenant_id, created_at, feed_id)) 
WITH compression = { 'sstable_compression' : 'LZ4Compressor' } 
AND CLUSTERING ORDER BY (created_at DESC); 

दो दृष्टिकोण मैं के बारे में सोचा है, लेकिन दोनों गंभीर नुकसान कर रहे हैं: एक अलग मेज पर
1. ले जाएँ हटाए गए रिकॉर्ड। प्रश्न छोटे हैं और कोई माइग्रेशन की आवश्यकता नहीं है, लेकिन बेवकूफ आवेषण मुश्किल लगते हैं (केवल सम्मिलित करने से पहले पढ़ा जाता है?)।
2. is_deleted कॉलम जोड़ें। प्रश्नों का समर्थन करने के लिए उस कॉलम के लिए द्वितीयक अनुक्रमणिका बनाएं। बेवकूफ आवेषण का समर्थन करना आसान लगता है (हल्के लेनदेन या एक अद्यतन चाल)। मुख्य नुकसान यह है कि पुराने रिकॉर्ड में शून्य मान होता है, इस प्रकार इसे डेटा माइग्रेशन की आवश्यकता होती है।

क्या कोई तीसरा और सुरुचिपूर्ण दृष्टिकोण है? क्या आप उपर्युक्त सुझावों में से एक का समर्थन करते हैं?

उत्तर

1

यदि आप हटाए गए रिकॉर्ड्स के लिए एक अलग तालिका बनाए रखते हैं, तो आप अपने "चाल" ऑपरेशन को करने के लिए सीक्यूएल के BATCH निर्माण का उपयोग कर सकते हैं, लेकिन चूंकि उस तालिका में हटाने का एकमात्र रिकॉर्ड है, तो आपको इसे पहले देखना चाहिए यदि आप व्यवहार चाहते हैं आपने हटाए गए रिकॉर्ड्स को फिर से एनिमेट करने के बारे में वर्णित नहीं किया है। लेखन से पहले पढ़ना आम तौर पर एक विरोधी पैटर्न, आदि

एक is_deleted स्तंभ , कुछ माइग्रेशन काम की आवश्यकता हो सकती, जैसा कि आप का उल्लेख का उपयोग करना है, लेकिन संभवत: अधिक गंभीर समस्या आप हो सकता है एक बहुत कम पर एक सूचकांक बनाने कि है -कार्डिनिटी कॉलम आमतौर पर बेहद अक्षम है। boolean फ़ील्ड के साथ, मुझे लगता है कि आपकी अनुक्रमणिका में केवल दो पंक्तियां होंगी। यदि आप अक्सर बार नहीं हटाते हैं, तो इसका मतलब है कि आपकी "झूठी" पंक्ति बहुत व्यापक होगी और इसलिए almost useless

आप is_deleted स्तंभ के लिए एक उच्च माध्यमिक सूचकांक बनाने से बचें और जब तक केवल स्पष्ट true हटाए गए इंगित करता है आप, दोनों null और false सक्रिय रिकॉर्ड यह संकेत करने की अनुमति है, तो आप कुछ भी माइग्रेट करने की आवश्यकता नहीं हो सकता है। (क्या आप वास्तव में माइग्रेशन के दौरान हटाए जाने वाले मौजूदा रिकॉर्ड जानते हैं?) फिर आप क्लाइंट को हटाए गए रिकॉर्ड फ़िल्टरिंग छोड़ देंगे, जो शायद आपके कुछ पेजिंग व्यवहार के प्रभारी होने जा रहे हैं। इस डिज़ाइन की कमी यह है कि आपको एन प्राप्त करने के लिए एन रिकॉर्ड्स के लिए पूछना पड़ सकता है जो हटाए नहीं गए हैं!

मुझे आशा है कि प्रश्न को मदद और संबोधित करें जैसा आपने कहा है। मुझे यह जानकर उत्सुकता होगी कि आपको जीवन में वापस लाए जाने वाले पहले से हटाए गए रिकॉर्ड्स के खिलाफ क्यों सुरक्षा की आवश्यकता होगी, लेकिन मैं ऐसी परिस्थिति की कल्पना कर सकता हूं जहां आपके पास एक विशेष फ़ीड (और सीएएस समस्याएं उत्पन्न हो सकती हैं) पर काम कर रहे कई कलाकार हैं।

कुछ हद तक असंबंधित नोट पर, आप अपने created_at फ़ील्ड के लिए timestamp के बजाय timeuuid का उपयोग करने पर विचार करना चाह सकते हैं। सीक्यूएल उस तारीख को पुनः प्राप्त करने के लिए dateOf() फ़ंक्शन का समर्थन करता है यदि यह एक ठोकर खा रहा है। (आपके tenant_id विभाजनों में टकराव करना भी असंभव हो सकता है, इस मामले में आप सुरक्षित रूप से मुझे अनदेखा कर सकते हैं।)

+0

मुझे पहले से ही हटाए गए रिकॉर्ड्स के खिलाफ जीवन में लाया जा रहा है, क्योंकि सिस्टम को डिज़ाइन किया गया है कि एक रिकॉर्ड को एक से अधिक बार भेजा जा सकता है (रीट्रीज़, माइग्रेशन, सेल्फ हीलिंग प्रोसेस)। उन मामलों में यह उम्मीद की जाती है कि एक बार रिकॉर्ड डालने के बाद, इसे बदला नहीं जाएगा, जब तक कोई उपयोगकर्ता इसे हटा देता है। –

+1

'is_deleted' के बारे में: विभाजन कुंजी (tenant_id) को हमेशा क्वेरी में निर्दिष्ट किया जाता है, द्वितीयक सूचकांक कम कार्डिनालिटी फ़ील्ड के लिए भी कुशल होना चाहिए: [http://stackoverflow.com/q/26439396/3950710] –

संबंधित मुद्दे