डेटाबेस सिंक्रनाइज़ेशन और सॉफ्ट-डिलीट परिदृश्यों में ध्वस्त तालिका बनाम नष्ट किए गए झंडे


17

मुझे ग्राहक सिंक्रनाइज़ेशन आवश्यकताओं के लिए हटाए गए आइटम का ट्रैक रखने की आवश्यकता है।

सामान्य तौर पर, क्या एक समाधि की मेज और एक ट्रिगर जोड़ना बेहतर होता है जो सर्वर डेटाबेस से एक पंक्ति हटाए जाने पर ट्रैक करता है - मूल रूप से हटाए गए आइटम के डेटा के साथ कब्र की मेज में एक नई पंक्ति जोड़ रहा है - या आइटम को रखने के लिए। मूल तालिका और उन्हें हटाए गए ध्वज के रूप में, आमतौर पर टाइप बिट के एक कॉलम के साथ, यह इंगित करने के लिए कि एक पंक्ति हटा दी जाती है और हटाए जाने पर एक अन्य स्तंभ को ट्रैक करने के लिए?

जवाबों:


17

सामान्य तौर पर, विशिष्ट आवश्यकताओं को जानना बेहतर होता है और अधिकांश स्थितियों में सबसे अच्छा काम करने के आधार पर डिजाइन निर्णय नहीं लेते हैं। या तो बेहतर हो सकता है। यहां कुछ विशेष जानकारी दी गई है:

  • कितनी तेजी से हटाने की आवश्यकता है?
  • कितनी जल्दी अन-डिलीट करने की जरूरत है?
  • कितनी बार हटाए गए डेटा को क्वेर किया जाएगा और क्या यह उन डेटा के साथ क्वेर किया जाएगा जिन्हें डिलीट नहीं किया गया है?
  • हटाए गए डेटा के प्रश्नों को कितनी तेज़ होना चाहिए?
  • क्या आपको केवल हटाए गए आइटम या परिवर्तनों को संरक्षित करने की आवश्यकता है?
  • क्या आपको प्राथमिक टेबल पर टेबल / इंडेक्स को छोटा रखने की आवश्यकता है?
  • डेटाबेस प्लेटफ़ॉर्म पर क्या विभाजन और / या ट्रैकिंग तकनीक उपलब्ध हैं?
  • कितना डिस्क स्थान उपलब्ध है?
  • विलोपन मक्खी पर या बैच संचालन में होगा?

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

आपको यह मिला। यहां तक ​​कि ऐसे मामले भी हो सकते हैं जहां एक और विकल्प बेहतर होगा। उदाहरण के लिए, यदि आपको केवल 24 घंटे उपलब्ध होने के लिए सॉफ्ट डिलीट की आवश्यकता होती है, तो ओरेकल में आप एक गारंटीकृत पूर्वधारणा समय सेट करने पर विचार कर सकते हैं और फिर हटाए गए डेटा को देखने के लिए फ्लैशबैक प्रश्नों का उपयोग कर सकते हैं।
लीघ रिफ़ेल

5

हो सकता है कि आपको उद्देश्य पर दो तरीकों को संयोजित करना चाहिए। क्यों ???

आइए उस तालिका का उपयोग करें (MySQL-dialect)

CREATE TABLE mydata
(
    id int not null auto_increment
    firstname varchar(16) not null,
    lastname varchar(16) not null,
    zipcode char(5) not null,
    ...
    deleted tinyint not null default 0
    KEY (deleted,id),
    KEY (deleted,lastname,firstname,id),
    KEY (deleted,zipcode,id),
    KEY (lastname,firstname),
    KEY (zipcode),
    PRIMARY KEY (id)
);

कृपया ध्यान दें कि, प्राथमिक कुंजी के अपवाद के साथ, आपके द्वारा बनाया गया प्रत्येक सूचकांक deletedध्वज से पहले होना चाहिए और उसके साथ समाप्त होना चाहिए id

चलो कब्र की मेज बनाते हैं

CREATE TABLE mytomb SELECT id FROM mydata WHERE 1=2;
ALTER TABLE mytomb ADD PRIMARY KEY (id);

यदि आपकी तालिका में पहले से ही एक deletedध्वज है, तो आप tommstone तालिका को पॉप्युलेट कर सकते हैं

INSERT INTO mytomb SELECT id FROM mydata WHERE deleted = 1;

ठीक है अब डेटा और समाधि पूर्वनिर्मित हैं। आप डिलीट कैसे करते हैं?

मान लीजिए कि आप 07305 ज़िपकोड में प्रत्येक व्यक्ति को हटा रहे हैं। आप निम्नलिखित चलाएंगे:

INSERT IGNORE INTO mytomb SELECT id FROM mydata WHERE deleted=0 AND zipcode='07305';
UPDATE mydata SET deleted=1 WHERE deleted=0 AND zipcode='07305';

ठीक है यह ओवरहेड की तरह लगता है जिस तरह से आप इसे देखते हैं।

अब, क्या आप सभी हटाए गए डेटा को देखना चाहते हैं? यहाँ दो अलग-अलग तरीके हैं:

  • SELECT * FROM mydata WHERE deleted=1;
  • SELECT B.* FROM mytomb A INNER JOIN mydata B USING (id);

यदि मायटॉम्ब में आईडी की संख्या mydata की पंक्ति-पंक्ति के 5% से अधिक है, तो यह पूर्ण तालिका स्कैन है। अन्यथा, प्रत्येक पंक्ति के लुकअप के साथ एक इंडेक्स स्कैन। इन मामलों में किसी भी मानदंड पर ध्यान दें। व्याख्या योजनाओं को देखें।

अब, क्या आप zipcode 07304 में प्रत्येक व्यक्ति को देखना चाहते हैं? यहाँ दो अलग-अलग तरीके हैं:

  • SELECT * FROM mydata WHERE deleted=1 AND zipcode='07304';
  • SELECT A.* FROM mydata A LEFT JOIN mytomb B USING (id) WHERE B.id IS NULL AND A.zipcode='07304'

कैसे बड़े पैमाने पर हटाता है? यहाँ दो अलग-अलग तरीके हैं:

  • DELETE FROM mydata WHERE deleted=1;
  • DELETE B.* FROM mytomb A INNER JOIN mydata B USING (id); DELETE FROM mytomb;

निष्कर्ष

अब, मैं दोनों विधियों को रखने के लिए नहीं कह रहा हूं। समय के साथ ऐसा करने से पता चलता है कि समग्र परिचालन के संदर्भ में कौन सी विधि तेज है। आपको यह तय करना होगा कि लाइव डेटा को क्वेरी करने, डिलीट किए गए डेटा को क्वेरी करने और बड़े पैमाने पर डिलीट करने के लिए कौन से बेंचमार्क आपके लिए सबसे अच्छा काम करते हैं।


क्या निरंतर आधार पर दोनों तकनीकों का उपयोग करने का कोई फायदा है? या आप केवल प्रदर्शन का मूल्यांकन करने के लिए समानांतर में उनका उपयोग करने का सुझाव दे रहे हैं, और फिर एक या दूसरे के लिए प्रतिबद्ध हैं?
जॉन ऑफ ऑल ट्रेड्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.