उत्तर थोड़ा निर्भर करता है यदि आप पोस्टग्रेएसक्यूएल (पूरी तरह से एसक्यूएल अनुपालन नहीं) जैसे फ्रीवेयर तक सीमित हैं, या यदि आप एसक्यूएल (यानी एसक्यूएल अनुपालन) और बड़े डेटाबेस के बारे में सोच रहे हैं।
SQL अनुपालन में, ओपन आर्किटेक्चर डेटाबेस, जहां एक डेटाबेस का उपयोग करने वाले कई ऐप्स हैं, और डेटा, मानकों, सामान्यीकरण, और ओपन आर्किटेक्चर आवश्यकताओं तक पहुंचने के लिए विभिन्न रिपोर्ट टूल (केवल ऐप्स नहीं) का उपयोग करने वाले कई उपयोगकर्ता महत्वपूर्ण हैं।
उन लोगों के बावजूद जो "सामान्यीकरण" की परिभाषा को बदलने का प्रयास करते हैं, आदि अपने हमेशा बदलते उद्देश्य के अनुरूप, सामान्यीकरण (विज्ञान) नहीं बदला है।
-
अगर आपके पास डेटा मान है जैसे {
Open; Closed; etc
} डेटा तालिकाओं में दोहराया गया, यानी डेटा दोहराव , एक साधारण सामान्यीकरण त्रुटि:यदि आप वे मान बदलते हैं, तो आपको लाखों पंक्तियों को अपडेट करना पड़ सकता है, जो कि बहुत सीमित डिज़ाइन है।-
ऐसे मानों को एक संक्षिप्त
CHAR(2)
. के साथ एक संदर्भ या लुकअप तालिका में सामान्यीकृत किया जाना चाहिए पीके:O Open C Closed U [NotKnown]
-
डेटा मान {
Open;Closed;etc
} अब लाखों पंक्तियों में डुप्लीकेट नहीं हैं। यह जगह भी बचाता है। -
दूसरा बिंदु परिवर्तन में आसानी है, यदि
Closed
Expired
. में बदल दिया गया , फिर से, एक पंक्ति को बदलने की आवश्यकता है, और यह पूरे डेटाबेस में परिलक्षित होता है; जबकि गैर-सामान्यीकृत फ़ाइलों में, लाखों पंक्तियों को बदलने की आवश्यकता होती है। -
नए डेटा मान जोड़ना , उदा. (
H,HalfOpen
) तो बस एक पंक्ति डालने की बात है।
-
-
में ओपन आर्किटेक्चर शब्द, लुकअप तालिका एक साधारण तालिका है। यह [एसक्यूएल अनुपालन] कैटलॉग में मौजूद है; जब तक
FOREIGN KEY
संबंध को परिभाषित किया गया है, रिपोर्ट टूल उसे भी ढूंढ सकता है। -
ENUM
एक गैर-एसक्यूएल है, इसका इस्तेमाल न करें। SQL में "enum" एक लुकअप टेबल है। -
अगला बिंदु कुंजी की सार्थकता से संबंधित है।
- यदि उपयोगकर्ता के लिए कुंजी अर्थहीन है, तो ठीक है, {
INT;BIGINT;GUID;etc
का उपयोग करें } या जो भी उपयुक्त हो; उन्हें क्रमिक रूप से संख्या न दें; "अंतराल" की अनुमति दें। - लेकिन यदि उपयोगकर्ता के लिए कुंजी सार्थक है, तो अर्थहीन संख्या का उपयोग न करें, सार्थक संबंधपरक कुंजी का उपयोग करें।
- यदि उपयोगकर्ता के लिए कुंजी अर्थहीन है, तो ठीक है, {
-
अब कुछ लोग पीके के स्थायित्व के संबंध में स्पर्शरेखा में आ जाएंगे। वह एक अलग बिंदु है। हां, बिल्कुल, पीके के लिए हमेशा स्थिर मान का उपयोग करें ("अपरिवर्तनीय" नहीं, क्योंकि ऐसी कोई चीज़ मौजूद नहीं है, और सिस्टम द्वारा उत्पन्न कुंजी पंक्ति विशिष्टता प्रदान नहीं करती है)।
-
{
M,F
} बदलने की संभावना नहीं है -
अगर आपने {
0,1,2,4,6
. का इस्तेमाल किया है }, इसे न बदलें, आप क्यों चाहेंगे। उन मूल्यों को अर्थहीन माना जाता था, याद रखें, केवल एक सार्थक कुंजी को बदलने की जरूरत है। -
यदि आप सार्थक कुंजियों का उपयोग करते हैं, तो छोटे अक्षर कोड का उपयोग करें, जिसे डेवलपर्स आसानी से समझ सकें (और इससे लंबे विवरण का अनुमान लगा सकें)। आप इसकी सराहना तभी करेंगे जब आप
SELECT
. को कोड करेंगे और महसूस करें कि आपकोJOIN
करने की आवश्यकता नहीं है हर लुकअप टेबल। पावर उपयोगकर्ता भी, इसकी सराहना करें।
-
-
चूंकि पीके स्थिर हैं, खासकर लुकअप टेबल में, आप सुरक्षित रूप से कोड कर सकते हैं:
WHERE status_code = 'O' -- Open
आपको यह नहीं करना है
JOIN
लुकअप तालिका और प्राप्त करें डेटा मानOpen
, डेवलपर के रूप में, आपको लुकअप पीके का मतलब पता होना चाहिए।
अंत में, यदि डेटाबेस बड़ा था, और OLTP के अतिरिक्त BI या DSS या OLAP फ़ंक्शन समर्थित थे (ठीक से सामान्यीकृत डेटाबेस कर सकते हैं), तो लुकअप तालिका वास्तव में आयाम-तथ्य में एक आयाम या वेक्टर है। विश्लेषण करता है यदि यह वहां नहीं था, तो इस तरह के विश्लेषणों को माउंट करने से पहले, उस सॉफ़्टवेयर की आवश्यकताओं को पूरा करने के लिए इसे जोड़ना होगा।
- यदि आप शुरू से ही अपने डेटाबेस में ऐसा करते हैं, तो आपको बाद में इसे (और कोड) अपग्रेड नहीं करना पड़ेगा।
आपका उदाहरण
SQL एक निम्न-स्तरीय भाषा है, इस प्रकार यह बोझिल है, खासकर जब JOINs
की बात आती है . हमारे पास यही है, इसलिए हमें केवल भार को स्वीकार करने और उससे निपटने की जरूरत है। आपका उदाहरण कोड ठीक है। लेकिन सरल रूप वही काम कर सकते हैं।
एक रिपोर्ट टूल जेनरेट करेगा:
SELECT p.*,
s.name
FROM posts p,
status s
WHERE p.status_id = s.status_id
AND p.status_id = 'O'
एक और उदाहरण
बैंकिंग सिस्टम के लिए, जहां हम छोटे कोड का उपयोग करते हैं जो अर्थपूर्ण होते हैं (चूंकि वे सार्थक होते हैं, हम उन्हें मौसम के साथ नहीं बदलते हैं, हम केवल उन्हें जोड़ते हैं), एक लुकअप तालिका दी जाती है जैसे (ध्यान से चुना गया, आईएसओ देश कोड के समान) :Eq Equity
EqCS Equity/Common Share
OTC OverTheCounter
OF OTC/Future
इस तरह का कोड आम है:
WHERE InstrumentTypeCode LIKE "Eq%"
और GUI के उपयोगकर्ता
{Equity/Common Share;Over The Counter
प्रदर्शित करने वाले ड्रॉप-डाउन से मान चुनेंगे },
नहीं {Eq;OTC;OF
}, नहीं {M;F;U
}.
बिना लुकअप टेबल के, आप ऐप में या रिपोर्ट टूल में ऐसा नहीं कर सकते।