एक रिलेशनल डेटाबेस में सिंगलटन को मॉडल करने का सबसे अच्छा तरीका


12

वेब अनुप्रयोगों के लिए रिलेशनल डेटाबेस स्कीमा डिजाइन करते समय, मुझे अक्सर एक मामला मिलता है जहां मैं एक पंक्ति बनाने के लिए एक तालिका बनाता हूं, और केवल एक पंक्ति। ऐसा लगता है कि यह डिजाइन करने का गलत तरीका है, लेकिन मैं कुछ भी बेहतर नहीं कर सकता, या यह स्पष्ट रूप से "इसे करने का सही तरीका है।"

एक हालिया उदाहरण एक साइट है जो उपयोगकर्ताओं को होम पेज पर सामग्री को मैन्युअल रूप से नियंत्रित करने देती है। ठीक है, केवल एक होम पेज है। मैंने एक तालिका बनाई जिसमें मुखपृष्ठ बनाने के लिए सभी आवश्यक क्षेत्र थे, जैसे कि एक क्षेत्र के लिए एक पाठ क्षेत्र जिसमें वर्णनात्मक पाठ शामिल था। एक बड़ी छवि फ़ाइल का नाम संग्रहीत करने के लिए एक फ़ील्ड। कुछ विदेशी कुंजियाँ जो उन लेखों की ओर इशारा करती हैं जिन्हें मुखपृष्ठ पर दिखाया जाएगा, आदि यह काम करता है, लेकिन यह गलत लगता है कि सिर्फ एक पंक्ति के साथ एक तालिका है।

अतीत में मैंने कई अन्य डिजाइनों की कोशिश की है, जैसे कि मुखपृष्ठ तालिका में कई पंक्तियों को अनुमति देना और यादृच्छिक पर एक का चयन करना। मैंने "सक्रिय" नाम के बूलियन फ़ील्ड को जोड़ने और यादृच्छिक पर सक्रिय होमपेज़ में से एक का चयन करने की कोशिश की है। मैंने आवेदन तर्क में किसी भी समय केवल एक पंक्ति को सक्रिय करने के लिए मजबूर करने की कोशिश की है। मैंने एक होमपेज टेबल बनाने की कोशिश भी नहीं की है और अन्य सभी वस्तुओं, जैसे कि लेख, में विशेष रूप से फ़ीचर्ड_ऑन_होमपेज जैसे नामों के साथ बूलियन फ़ील्ड हैं।

ज्यादातर मामलों में मैं एक सेटिंग फ़ाइल में स्थिरांक के साथ होमपेज का निर्माण कर सकता था। सेटिंग्स फ़ाइल के साथ मुख्य समस्या यह है कि यह डेवलपर नियंत्रण में है। चूँकि उपयोगकर्ता द्वारा संपादित की जाने वाली होमपेज की सामग्री कुछ ऐसी है, इसे डेटाबेस में जाना होगा।

कई साइटों पर, मुझे यह समस्या नहीं है क्योंकि मैं एक क्वेरी के साथ मुखपृष्ठ जैसी चीजों का निर्माण कर सकता हूं जैसे कि पांच नवीनतम लेखों का चयन करना। लेकिन जब मेरे पास ऐसे पृष्ठ होते हैं जिन्हें मैन्युअल रूप से सख्त आवश्यकताओं के साथ क्यूरेट किया जाता है, तो इसे डेटाबेस में मॉडल करना मुश्किल हो जाता है। लेकिन कल्पना कीजिए कि आपको एक फोटो टेबल और एक लेख तालिका मिल गई है। आवश्यकता यह है कि होमपेज उपयोगकर्ता द्वारा नियंत्रित मैन्युअल रूप से पांच तस्वीरें, बिल्कुल तीन लेख और मनमाने ढंग से पाठ के दो ब्लॉक प्रदर्शित करेगा। आप कैसे डेटाबेस में सही तरीके से मॉडल करते हैं?

इसके अलावा, मुझे सिर्फ मॉडलिंग के अलावा कई अन्य मामलों में भी मॉडलिंग की समस्या है। यह सिर्फ सबसे आसान और सबसे अधिक लागू होने वाला उदाहरण है जिसके साथ मैं आ सकता हूं।


यह बिल्कुल स्पष्ट नहीं है कि एकल पंक्ति तालिका आपके लिए क्या समस्या प्रस्तुत करती है, इसके अलावा यह किसी तरह से तालिका की बर्बादी का प्रतिनिधित्व करता है। क्या आप वाकई एक समस्या को हल करने का प्रयास कर रहे हैं जिससे आप वास्तव में पीड़ित हैं?
डेविड एल्ड्रिज

जवाबों:


10

एक सरल तरीका यह होगा कि होम पेज प्रॉपर्टीज को प्रॉपर्टीज टेबल में सेव करें (या इसे कुछ और कहें) जो कि Name & Value कॉलम से बना है।

HomePageProperty1 - UserValue1

HomePageProperty2 - UserValue2

यह एक आदर्श समाधान नहीं हो सकता है, लेकिन यह सरल और लचीला है। यह एक पंक्ति परिदृश्य के साथ तालिका को भी समाप्त करता है।


1
यह दृष्टिकोण कई उद्देश्यों के लिए काम करता है। उदाहरण के लिए, मैं स्कीमा संस्करण जानकारी, रोटेशन पॉइंटर्स को उन चीजों के लिए संग्रहीत करूंगा, जिन्हें दैनिक रूप से साइकिल चलाने की आवश्यकता होती है, आदि स्कीमा संस्करण जानकारी महत्वपूर्ण है जब निदान किया गया कि क्या गलत हुआ। यह सुनिश्चित करने का एक उचित तरीका है कि एक पैच केवल डेटाबेस के लिए ठीक किया गया हो।
बेरिन लोरिट्सच

2
+1 - यह सटीक टेबल लेआउट है जो हमारे डेटा आर्किटेक्ट ने मुझे एक समान उद्देश्य के लिए दिया था।
अली

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

3

यह मेरे लिए स्पष्ट नहीं है कि आपके पास एक समस्या है जिसे आपको हल करने की आवश्यकता है।

एक एकल-पंक्ति तालिका किसी भी तरह से डेटाबेस के लिए समस्या नहीं है, और आपको डेटा प्रकार और बाधाओं को डेटा पर लागू करने की अनुमति देती है।

मुझे यकीन नहीं है कि आप एक वास्तविक समस्या को हल करने की कोशिश कर रहे हैं, ईमानदार होने के लिए।


2

यह मुझे लगता है कि आप किसी ऐसी चीज़ के लिए डेटाबेस का उपयोग कर रहे हैं जिसे वास्तव में फ़ाइल के रूप में संग्रहीत किया जाना चाहिए।

आपका विवरण मुझे बहुत सारे विकी पृष्ठ याद दिलाता है, जहाँ उपयोगकर्ता सामग्री संपादित कर सकते हैं। विकी में, या कम से कम कार्यान्वयन में मैंने देखा है, पृष्ठ फाइलों के रूप में बने हुए हैं।

यह आपको अन्य वेब विवरणों के साथ मदद करता है जैसे कि आपके उपयोगकर्ताओं को आपके होम पेज को कैश करने की अनुमति देता है, जो व्यावहारिक रूप से मुफ्त में आता है यदि आप पृष्ठों को फ़ाइलों के रूप में संग्रहीत करते हैं, लेकिन यदि आप निर्माण कर रहे हैं तो आपको कैश अमान्य के तर्क को मैन्युअल रूप से लागू करना होगा। डेटाबेस पर संग्रहीत सामग्री के आधार पर हर अनुरोध पर पेज।

किसी भी मामले में, मैं बस यह स्पष्ट करना चाहता हूं कि भले ही किसी एप्लिकेशन के अधिकांश सतत डेटा एक डेटाबेस में संग्रहीत हैं, लेकिन इसका मतलब यह नहीं है कि हमें वहां सब कुछ स्टोर करना चाहिए। डेटाबेस हमारे व्यापार के उपकरणों में से एक है। हमें कई अलग-अलग साधनों का अच्छा उपयोग करना सीखना चाहिए।


2

एक पंक्ति के साथ तालिका में कुछ भी गलत नहीं है।

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

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

हां, मैं केवल एकल-पंक्ति तालिका नहीं कह रहा हूं, ठीक है, लेकिन मेरा सुझाव है कि आप उनमें से एक से अधिक चाहते हैं।


1

आप STATIC_CONTENT नामक एक तालिका बना सकते हैं और इसमें कुंजी के साथ-साथ सामग्री, सक्रिय / निष्क्रिय ट्रैकर्स आदि के लिए कॉलम हो सकते हैं, फिर "होमपेज" की कुंजी के साथ एक पंक्ति बनाएं और अपने होमपेज में, इस कुंजी के लिए स्थिर सामग्री लोड करें। और इसे प्रदर्शित करें। इस तरह, जब आपके पास अन्य स्थिर सामग्री (पृष्ठ, संपर्क पृष्ठ, आदि के बारे में) होती है, तो आप उस तालिका में पंक्तियाँ जोड़ सकते हैं।


1

केवल एकल पंक्ति वाली तालिका होने में प्रति सेगमेंट कुछ भी गलत नहीं है। यदि आपके पास केवल एक निश्चित इकाई का एक उदाहरण है, तो यह बहुत अच्छी तरह से इस का प्रतिनिधित्व करने का सबसे स्वाभाविक तरीका हो सकता है।

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


0

बस वाल्टर में जोड़ने के लिए ..

संपत्ति तालिका संरचना में कई डेटा प्रकारों की अनुमति होनी चाहिए।

Fileds:
PropertyName
PropertyTextValue
PropertyDateValue
PropertyNumericValue
PropertyBoolValue

इसके साथ, आप कैसे गारंटी देते हैं कि प्रति पंक्ति में केवल एक प्रॉपर्टी का सेट है? आवेदन में इसे लागू करना काफी आसान है, लेकिन क्या होगा अगर कोई तब डेटाबेस को मैन्युअल रूप से अपडेट करता है और वहां कुछ डेटा चिपका देता है?
अपरचेस

0

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

आवश्यकता यह है कि होमपेज उपयोगकर्ता द्वारा नियंत्रित मैन्युअल रूप से पांच तस्वीरें, बिल्कुल तीन लेख और मनमाने ढंग से पाठ के दो ब्लॉक प्रदर्शित करेगा। आप कैसे डेटाबेस में सही तरीके से मॉडल करते हैं?

आइये इसे ऐसे ही आजमाते हैं। मैं एक ArticlePage तालिका जोड़ रहा हूं ताकि आप देखें कि आप अपने अनुसार गुण कैसे अलग कर सकते हैं।

PAGES
Id
Title
Description

HOMEPAGES
PageId (FK)
PhotoListLimit
ArticleListLimit
TextBlockListLimit

ARTICLEPAGE
PageId (FK)
ArticleMainQuote
ArticleMainBody
ArticlePhoto1
ArticlePhoto2

यह मेरे लिए ठीक काम करेगा, एक बड़ी साइट के लिए भी बढ़िया काम करेगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.