2010-02-19 19 views
8

मैं एक ऑनलाइन कैटलॉग प्रबंधित करता हूं। वर्तमान में घर के कर्मियों ने इसे मैन्युअल रूप से अपडेट किया है, और उनके परिवर्तन तुरंत दिखाई दे रहे हैं। अब हम एक सत्यापन कदम जोड़ना चाहते हैं: टॉम एक बदलाव करता है, जैरी इसे मंजूरी देता है।अपडेट-समीक्षा-प्रकाशित वर्कफ़्लो प्रबंधित करने का सबसे अच्छा तरीका?

मुझे दो पथ दिखाई देते हैं, लेकिन न ही सुरुचिपूर्ण लगता है।

  1. पूरे डेटाबेस की दूसरी, 'कार्यशील प्रति' रखें।
  2. उसी डेटाबेस के अंदर 'गंदे' टेबल का दूसरा सेट रखें।

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

क्या कोई बेहतर तरीका है? यदि यह महत्वपूर्ण है, तो डीबीएमएस एसक्यूएल सर्वर है, वेब ऐप एएसपीनेट है।

संपादित जोड़ने के लिए:

  1. दो परिवर्तन मैं ऊपर उल्लिखित मौजूदा कोड के साथ दोनों पार्श्व-संगत कर रहे हैं। मुझे पता है कि मुझे कुछ बदलाव करना होगा, लेकिन मैं प्रत्येक क्वेरी को बदल नहीं सकता।

  2. मुझे लगता है कि मेरी मुख्य बाधाएं पंक्तियों को क्लोन करने और उन्हें 'लंबित' चिह्नित करने पर रोक लगाती हैं।

मान लें कि प्रदायक के 99 के साथ प्रदायक के दो उत्पाद हैं। (उत्पाद केवल एक सप्लायर आईडी से संबंधित हो सकते हैं।) प्रदायक का फोन नंबर बदल गया है, इसलिए मैंने प्रदायक रिकॉर्ड क्लोन किया है, फोन नंबर बदल दिया है, और इसे 'लंबित' चिह्नित किया है। लेकिन नए रिकॉर्ड में 99 की आईडी नहीं हो सकती है, इसलिए अब इसे अपने उत्पादों या यहां तक ​​कि रिकॉर्ड को बदलने के इरादे से जोड़ने का कोई तरीका नहीं है।

मुझे लगता है कि मैं एक अनजान पहचानकर्ता, सप्लायरस्यूडॉइड जोड़ सकता हूं, लेकिन यह उपर्युक्त विचारों के रूप में जटिल और त्रुटि-प्रवण जैसा लगता है।

उत्तर

6

आपको टेबल की एक प्रति की आवश्यकता क्यों है? इसके बजाय तालिका में approved फ़ील्ड क्यों न जोड़ें?


संपादित करने के लिए उत्तर:

आप एक नए क्षेत्र appoved कहा जाता है जोड़ सकते हैं और प्राथमिक कुंजी हो बनाने के लिए एक मेज

id | name | text | modified | etc 
----------------------------------- 
1 | aaaa | blabla | 20100210 | xxx 
2 | bbbb | yadayada| 20100212 | yyy 
3 | cccc | asdfkad | 20090102 | zzz 

की तरह आप इसे बदल सकते हैं है, तो दोनों id और modified

id | name | text | modified | etc | approved 
----------------------------------------------- 
1 | aaaa | blabla | 20100210 | xxx | 1 
2 | bbbb | yadayada| 20100212 | yyy | 1 
3 | cccc | asdfkad | 20090102 | zzz | 1 
3 | cccc | qwerklj | 20100219 | zzz | 0 

आप एक बनाते हैं का मानना ​​है कि केवल आप लाता है

id | name | text | modified | etc 
----------------------------------- 
1 | aaaa | blabla | 20100210 | xxx 
2 | bbbb | yadayada| 20100212 | yyy 
3 | cccc | asdfkad | 20090102 | zzz 

SELECT id, name, text, modified, etc FROM catalog WHERE approved = 1; की तरह कुछ, इस तरह आप केवल "तालिका" प्रश्नों में से चयन को संशोधित करने के लिए है के रूप में यह परिभाषित करके।प्रविष्टि आप 0 का डिफ़ॉल्ट मान अनुमोदित देना चाहिए संशोधित करने और तरह

INSERT INTO catalog (id, name, text, modified, etc, approved) 
    VALUES (SELECT id, name, text, NOW(), etc, 0) 

जो कुछ की तरह

id | name | text | modified | etc | approved 
----------------------------------------------- 
1 | aaaa | blabla | 20100210 | xxx | 1 
2 | bbbb | yadayada| 20100212 | yyy | 1 
3 | cccc | asdfkad | 20090102 | zzz | 1 
3 | cccc | qwerklj | 20100219 | zzz | 0 

और नए सा कुछ के साथ खत्म हो जाएगा करने के लिए अद्यतन प्रश्नों को संशोधित करने से बचने के लिए इंटरफ़ेस आप "एक क्षेत्र को मंजूरी" करने के लिए क्या करना होगा कि की

UPDATE catalog SET approved = 1; 
DELETE FROM catalog WHERE id = @id AND approved = 1 AND MIN(modified); 

करना होगा जो

0,123,516 में परिणाम होगा
id | name | text | modified | etc | approved 
----------------------------------------------- 
1 | aaaa | blabla | 20100210 | xxx | 1 
2 | bbbb | yadayada| 20100212 | yyy | 1 
3 | cccc | qwerklj | 20100219 | zzz | 1 

यदि आप ट्रिगर या संग्रहीत प्रक्रिया करते हैं तो यह अंतिम बिट और भी सरल हो सकता है।

यह एक बहुत ही अस्पष्ट उदाहरण है, जो आपकी आवश्यकताओं के अनुकूल है।

+0

और डेटाबेस डिज़ाइन के बारे में बात करते समय हमेशा याद रखें: * इसे तब तक सामान्य करें जब तक यह दर्द न हो जाए, जब तक यह काम न करे *। – voyager

+0

ऊपर, मेरे संपादन देखें। इसके लायक होने के लिए, डेटाबेस पूरी तरह से सामान्यीकृत है और मुझे नहीं लगता कि कैसे denormalizing मेरी मदद करेगा; लेकिन मैं सीखने के लिए तैयार हूँ। – egrunin

+0

@ एग्रीनिन: यह सिर्फ एक पुरानी कहावत है। टेबल/डेटाबेस की प्रतिलिपि बनाकर आप नरक के रूप में denormalizing कर रहे हैं जो आम तौर पर एक अच्छा विचार नहीं है। प्रदर्शन में सुधार के लिए आम तौर पर denormalizing किया जाता है, लेकिन कम से कम किया जाना चाहिए। – voyager

1

मेरे पास एक अनुमोदित क्षेत्र होगा और मेरे पास उस क्षेत्र पर एक ट्रिगर होगा जो केवल अपरिवर्तित स्थिति में परिवर्तनों को सीमित करेगा, केवल उपयोगकर्ताओं की एक निश्चित भूमिका में आने के लिए (यदि आपके पास कोई भूमिका या समूह नहीं है अपने उपयोगकर्ताओं के लिए चीज टाइप करें, आपको यह भी आवश्यकता होगी ताकि आप जान सकें कि अधिकृत उपयोगकर्ता कौन हैं और आवेदक कौन हैं। इस तरह यदि सैम अपने स्वयं के परिवर्तन को स्वीकार करने की कोशिश करता है, तो ऐसा नहीं हो सकता है। मुझे यह सुनिश्चित करने के लिए एक तंत्र भी होगा कि यह सुनिश्चित करने के लिए कि एक एक परिवर्तन करने वाले अभ्यर्थी को एक अलग व्यक्ति द्वारा अनुमोदित किया जाना चाहिए।

आपके आवेदन को सूची के सामान्य उपयोगकर्ताओं को केवल अनुमोदित परिवर्तन देखने के लिए बदलना होगा, जब तक वे परिवर्तन या आने वाले व्यक्ति नहीं हैं।

+0

असल में, हर कोई संपादित करेगा और कुछ स्वीकृति दे सकते हैं, इसलिए सैम अक्सर अपने काम को मंजूरी दे रहे हैं। यह यहाँ कोई समस्या नहीं है। – egrunin

+0

यह मेरा दृष्टिकोण भी होगा, परिवर्तन ट्रैकिंग को सक्षम करने के अतिरिक्त चरण के साथ ताकि इनकार किए गए परिवर्तनों को पूर्ववत किया जा सके। –

+0

@ fatcat1111, अच्छा बिंदु – HLGEM

1

बस स्थिति के साथ अपनी महत्वपूर्ण तालिका संस्करण।

समान तालिका, बस अतिरिक्त पंक्तियां। तालिका में एक "प्रभावी तिथि" सीमा जोड़ें।

select * from catalog where item_code = '1234' and status = 'APPROVED' and 
today >= start_date and (today <= end_date or end_date is null) 

जब आप, डेटा को बदलने पंक्ति कॉपी, उसकी स्थिति "REVIEW" परिवर्तन करना चाहते हैं (या जो भी, फिर भी कई कदम तुम हो)।

फिर आपके समीक्षक इसे देख सकते हैं।

जब आप "प्रकाशित" करते हैं, तो वर्तमान "स्वीकृत" हो जाता है "आर्किविड", end_date = "आज", और "समीक्षा" पंक्ति एक शून्य end_date और start_date = "आज" के साथ "स्वीकृत" हो जाती है।

इसका अच्छा हिस्सा यह है कि यदि आप चाहें तो जल्दी से "रोल वापस" करने के लिए यह उचित रूप से मामूली है, और आपके पास हमेशा एक इतिहास है। बाद में, यदि आप इतने इच्छुक हैं, तो आप पुराने आर्किविइड डेटा को शुद्ध कर सकते हैं।

आप उन वस्तुओं को भी प्रतिष्ठित कर सकते हैं जो महीने के पहले तक बिक्री (या जो कुछ भी नहीं) पर जाते हैं।

+0

मुझे यकीन नहीं है कि यह मानचित्र बहु-तालिका की स्थिति में कैसे हैं (विवरण के लिए मेरा संपादन देखें), और निश्चित रूप से इसे मौजूदा ऐप में प्रत्येक क्वेरी को बदलने की आवश्यकता होगी। – egrunin

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