मैं जिस वेब एप्लिकेशन पर काम कर रहा हूं, उसके भीतर, सभी डेटाबेस ऑपरेशन एंटिटी फ्रेमवर्क ओआरएम पर परिभाषित कुछ जेनेरिक रिपॉजिटरी का उपयोग करके सारगर्भित हैं।
हालाँकि, जेनेरिक रिपॉजिटरी के लिए एक सरल डिज़ाइन होने के लिए, सभी शामिल तालिकाओं को एक अद्वितीय पूर्णांक ( Int32
C # में, int
SQL में) को परिभाषित करना होगा । अब तक, यह हमेशा तालिका का पीके रहा है और यह भी IDENTITY
।
विदेशी कुंजियों का भारी उपयोग किया जाता है और वे इन पूर्णांक स्तंभों का संदर्भ देते हैं। वे दोनों स्थिरता के लिए और ओआरएम द्वारा नेविगेशनल गुण पैदा करने के लिए आवश्यक हैं।
एप्लिकेशन परत आमतौर पर निम्नलिखित ऑपरेशन करती है:
- तालिका से प्रारंभिक डेटा लोड (*) -
SELECT * FROM table
- अपडेट -
UPDATE table SET Col1 = Val1 WHERE Id = IdVal
- हटाएं -
DELETE FROM table WHERE Id = IdVal
- सम्मिलित करें -
INSERT INTO table (cols) VALUES (...)
कम लगातार संचालन:
- थोक डालने -
BULK INSERT ... into table
पीछा (*) सभी डेटा लोड से (उत्पन्न पहचानकर्ता पुनः प्राप्त करने के) - बल्क डिलीट - यह एक सामान्य डिलीट ऑपरेशन है, लेकिन ORM के दृष्टिकोण से "भारी":
DELETE FROM table where OtherThanIdCol = SomeValue
- बल्क अपडेट - यह एक सामान्य अपडेट ऑपरेशन है, लेकिन ORM के दृष्टिकोण से "भारी":
UPDATE table SET SomeCol = SomeVal WHERE OtherThanIdCol = OtherValue
* सभी छोटे तालिकाओं को आवेदन स्तर पर कैश किया जाता है और लगभग सभी SELECTs
डेटाबेस तक नहीं पहुंचेंगे। एक विशिष्ट पैटर्न प्रारंभिक भार है और बहुत से INSERT
एस, UPDATE
एस और DELETE
एस है।
वर्तमान अनुप्रयोग उपयोग के आधार पर, किसी भी तालिका में 100M रिकॉर्ड तक पहुंचने की बहुत कम संभावना है।
प्रश्न: डीबीए के दृष्टिकोण से, क्या इस टेबल डिज़ाइन की सीमा होने से मैं महत्वपूर्ण समस्याएं उठा सकता हूं?
[संपादित करें]
उत्तर पढ़ने के बाद (महान प्रतिक्रिया के लिए धन्यवाद) और संदर्भित लेख, मुझे लगता है कि मुझे और विवरण जोड़ना होगा:
वर्तमान एप्लिकेशन की बारीकियों - मैंने वर्तमान वेब एप्लिकेशन के बारे में उल्लेख नहीं किया है, क्योंकि मैं यह समझना चाहता हूं कि क्या मॉडल को अन्य अनुप्रयोगों के लिए भी पुन: उपयोग किया जा सकता है। हालाँकि, मेरा विशेष मामला एक ऐसा अनुप्रयोग है जो एक DWH से बहुत सारे मेटाडेटा को निकालता है। स्रोत डेटा काफी गन्दा है (एक अजीब तरीके से चिह्नित किया गया है, कुछ विसंगतियां, कई मामलों में कोई प्राकृतिक पहचानकर्ता नहीं है) और मेरा ऐप स्पष्ट पृथक निकाय उत्पन्न कर रहा है। साथ ही, कई उत्पन्न किए गए पहचानकर्ता (
IDENTITY
) प्रदर्शित किए जाते हैं, ताकि उपयोगकर्ता उन्हें व्यावसायिक कुंजी के रूप में उपयोग कर सकें। यह एक बड़े पैमाने पर कोड के अलावा, GUID के उपयोग को छोड़कर ।"उन्हें एक पंक्ति को विशिष्ट रूप से पहचानने का एकमात्र तरीका नहीं होना चाहिए" (हारून बर्ट्रेंड ♦) - यह एक बहुत अच्छी सलाह है। मेरी सभी तालिकाएँ यह सुनिश्चित करने के लिए एक अद्वितीय अवधारणा को परिभाषित करती हैं कि व्यावसायिक डुप्लिकेट की अनुमति नहीं है।
फ्रंट-एंड ऐप संचालित डिज़ाइन बनाम डेटाबेस संचालित डिज़ाइन - डिज़ाइन विकल्प इन कारकों के कारण होता है
इकाई फ्रेमवर्क सीमाएँ - कई कॉलम पीके की अनुमति है, लेकिन उनके मूल्यों को अपडेट नहीं किया जा सकता है
कस्टम सीमाएँ - एक पूर्णांक कुंजी होने से डेटा संरचना और गैर-SQL कोड बहुत सरल हो जाता है। उदा: सभी सूचियों में पूर्णांक कुंजी और एक प्रदर्शित मूल्य होते हैं। अधिक महत्वपूर्ण, यह गारंटी देता है कि कैशिंग के लिए चिह्नित कोई भी तालिका एक
Unique int key -> value
मानचित्र में डाल सकेगी ।
जटिल चयन क्वेरी - यह लगभग कभी नहीं होगा क्योंकि सभी छोटे (<20-30K रिकॉर्ड) टेबल डेटा को एप्लिकेशन स्तर पर कैश किया जाता है। एप्लिकेशन कोड लिखते समय यह जीवन को थोड़ा कठिन बना देता है (LINQ लिखने के लिए कठिन), लेकिन डेटाबेस को बहुत अच्छे तरीके से मारा जाता है:
सूची दृश्य -
SELECT
लोड पर कोई प्रश्न उत्पन्न नहीं करेगा (सब कुछ कैश किया गया है) या इस तरह दिखने वाले प्रश्न:SELECT allcolumns FROM BigTable WHERE filter1 IN (val1, val2) AND filter2 IN (val11, val12)
अन्य सभी आवश्यक मान कैश लुकअप (O (1)) के माध्यम से प्राप्त किए जाते हैं, इसलिए कोई जटिल प्रश्न उत्पन्न नहीं होगा।
दृश्य संपादित करें -
SELECT
इस तरह के बयान उत्पन्न करेंगे :SELECT allcolumns FROM BigTable WHERE PKId = value1
(सभी फ़िल्टर और मान हैं int
)