क्या रिलेशनल डेटाबेस में सूचियों का उपयोग करना कभी ठीक है?


94

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

हालाँकि, मैं जिस समस्या में चल रहा हूँ, वह यह है कि मैं एक कार्य असाइनर बनाने की कोशिश कर रहा हूँ। लोग कार्य बनाएंगे, उन्हें कई लोगों को सौंपेंगे, और यह डेटाबेस को बचाएगा।

बेशक, अगर मैं इन कार्यों को व्यक्तिगत रूप से "व्यक्ति" में सहेजता हूं, तो मुझे दर्जनों डमी "टास्किड" कॉलम होने चाहिए और उन्हें माइक्रो-मैनेज करना होगा क्योंकि एक व्यक्ति को 0 से 100 कार्य सौंपे जा सकते हैं, कहते हैं।

फिर से, यदि मैं "टास्क" टेबल में कार्यों को सहेजता हूं, तो मुझे दर्जनों डमी "पर्सिड" कॉलम और माइक्रो-प्रबंधन करना होगा - पहले जैसी ही समस्या।

इस तरह की समस्या के लिए, क्या एक फॉर्म या किसी अन्य को लेने वाली आईडी की सूची को सहेजना ठीक है या क्या मैं सिर्फ दूसरे तरीके के बारे में नहीं सोच रहा हूं, यह सिद्धांतों को तोड़ने के बिना प्राप्त करने योग्य है?


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

12
शोध में अच्छा काम और फिर यहाँ पूछना! वास्तव में, 1 सामान्य रूप का उल्लंघन कभी नहीं करने की 'सिफारिश' ने आपके लिए वास्तव में अच्छा किया, क्योंकि आपको वास्तव में एक और, संबंधपरक दृष्टिकोण, अर्थात् "कई-से-कई" संबंधों के साथ आना चाहिए, जिसके लिए एक मानक पैटर्न है संबंधपरक डेटाबेस जिसका उपयोग किया जाना चाहिए।
13

6
"क्या यह कभी ठीक है" हाँ .... जो कुछ भी हो, इसका उत्तर हाँ है। जब तक आपके पास एक वैध कारण है। हमेशा एक उपयोग मामला होता है जो आपको सर्वोत्तम प्रथाओं का उल्लंघन करने के लिए मजबूर करता है क्योंकि यह ऐसा करने के लिए समझ में आता है। (आपके मामले में, हालांकि, आपको निश्चित रूप से नहीं करना चाहिए)
xyious

3
मैं वर्तमान में टैग की एक सूची को संग्रहीत करने के लिए एक सरणी ( एक सीमांकित स्ट्रिंग नहीं है VARCHAR ARRAY) का उपयोग कर रहा हूं । शायद यह नहीं है कि वे अंत में लाइन के बाद कैसे संग्रहीत किए जाएंगे, लेकिन प्रोटोटाइप चरणों के दौरान सूचियां बेहद उपयोगी हो सकती हैं, जब आपके पास इंगित करने के लिए और कुछ भी नहीं है और आप से पहले पूरे डेटाबेस स्कीमा का निर्माण नहीं करना चाहते हैं। और कुछ भी करो
निक हार्टले

3
@Ben " (हालांकि वे इंडेक्स करने योग्य नहीं होगा) " - Postgres में, JSON कॉलम के खिलाफ कई प्रश्नों (और शायद एक्सएमएल, हालांकि मैं जांच न की हो) कर रहे हैं इंडेक्सेबल।
निक हार्टले

जवाबों:


249

कुंजी शब्द और कुंजी अवधारणा जिसकी आपको जांच करने की आवश्यकता है, डेटाबेस सामान्यीकरण है

आप क्या करेंगे, व्यक्ति या कार्य तालिकाओं के लिए असाइनमेंट के बारे में जानकारी जोड़ने के बजाय, क्या आप प्रासंगिक रिश्तों के साथ उस असाइनमेंट की जानकारी के साथ एक नई तालिका जोड़ रहे हैं।

उदाहरण के लिए, आपके पास निम्न तालिकाएँ हैं:

व्यक्तियों:

+ ---- + ----------- +
| आईडी | नाम |
+ ==== + =========== +
| 1 | अल्फ्रेड |
| 2 | Jebediah |
| 3 | जैकब |
| 4 | ईजेकील |
+ ---- + ----------- +

कार्य:

+ ---- + -------------------- +
| आईडी | नाम |
+ ==== + ==================== +
| 1 | मुर्गियों को खिलाएं |
| 2 | हल |
| 3 | दुहना गायों |
| 4 | एक खलिहान उठाएँ |
+ ---- + -------------------- +

फिर आप असाइनमेंट्स के साथ एक तीसरा टेबल बनाएंगे। यह तालिका लोगों और कार्यों के बीच के संबंध को दर्शाती है:

+ ---- + ----------- + --------- +
| आईडी | व्यक्तिवाद | टास्कआईड |
+ ==== + =========== + ========= +
| 1 | 1 | 3 |
| 2 | 3 | 2 |
| 3 | 2 | 1 |
| 4 | 1 | 4 |
+ ---- + ----------- + --------- +

फिर हमारे पास एक विदेशी कुंजी बाधा होगी, जैसे कि डेटाबेस यह लागू करेगा कि उन विदेशी वस्तुओं के लिए व्यक्ति आईडी और टास्कआईड को वैध आईडी होना चाहिए। पहली पंक्ति के लिए, हम देख सकते हैं PersonId is 1, इसलिए अल्फ्रेडTaskId 3 , मिल्किंग गायों को सौंपा गया है ।

यहां आपको जो देखने में सक्षम होना चाहिए, वह यह है कि आपके पास प्रति कार्य या प्रति व्यक्ति के रूप में बहुत सारे कार्य हो सकते हैं। इस उदाहरण में, ईजेकील को कोई भी कार्य नहीं सौंपा गया है, और अल्फ्रेड को सौंपा गया है 2. यदि आपके पास 100 लोगों के साथ एक कार्य है, तो SELECT PersonId from Assignments WHERE TaskId=<whatever>;100 पंक्तियों का उत्पादन होगा, जिसमें कई अलग-अलग व्यक्तियों को सौंपा गया है। आप WHEREउस व्यक्ति को सौंपे गए सभी कार्यों को खोजने के लिए पर्सनड पर कर सकते हैं ।

यदि आप नाम और कार्यों के साथ Ids की जगह क्वेरी वापस करना चाहते हैं, तो आपको सीखना होगा कि तालिकाओं को कैसे जोड़ा जाए।


86
वह कीवर्ड जिसे आप और अधिक जानने के लिए खोजना चाहते हैं, वह है " कई-से-कई संबंध "
BlueRaja - Danny Pflughoeft

34
Thierrys टिप्पणी पर थोड़ा विस्तार से बताने के लिए: आप सोच सकते हैं कि आपको सामान्य करने की आवश्यकता नहीं है क्योंकि मुझे केवल X की आवश्यकता है और आईडी सूची को संग्रहीत करना बहुत आसान है , लेकिन बाद में विस्तारित होने वाली किसी भी प्रणाली के लिए आपको इसे सामान्यीकृत नहीं होने का पछतावा होगा। पहले। हमेशा सामान्य करें ; एकमात्र प्रश्न यह है कि सामान्य रूप
Jan Doggen

8
@ जान के साथ सहमत - मेरे बेहतर फैसले के खिलाफ मैंने कुछ समय पहले अपनी टीम को एक डिज़ाइन शॉर्टकट लेने की अनुमति दी थी, इसके बजाय JSON को संग्रहीत किया गया था, जिसे "विस्तारित करने की आवश्यकता नहीं होगी"। यह छह महीने FML की तरह रहा। हमारे अपगेडर ने JSON को उस योजना को स्थानांतरित करने के लिए अपने हाथों पर एक बुरा संघर्ष किया था जिसे हमें शुरू करना चाहिए था। मुझे वास्तव में बेहतर पता होना चाहिए था।
को ऑर्बिट

13
@ डेडप्लिकेटर: यह केवल बगीचे-किस्म, ऑटो-इंक्रीमेंट पूर्णांक प्राथमिक कुंजी कॉलम का प्रतिनिधित्व है। सुंदर ठेठ सामान।
whatsisname

8
@whatsisname व्यक्तियों या कार्य तालिका पर, मैं आपसे सहमत हूँ। एक पुल की मेज पर जहां एकमात्र उद्देश्य दो अन्य तालिकाओं के बीच कई-से-कई संबंधों का प्रतिनिधित्व करना है जिनके पास पहले से ही सरोगेट कुंजी है? मैं एक अच्छे कारण के बिना नहीं जोड़ूंगा। यह सिर्फ ओवरहेड है क्योंकि इसका उपयोग प्रश्नों या रिश्तों में कभी नहीं किया जाएगा।
jpmc26

35

आप यहां दो सवाल पूछ रहे हैं।

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

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


9
आपके द्वारा संदर्भित सामग्री उदाहरण सतह पर सही है; लेकिन यह उस मामले में स्पष्ट होगा। यह प्रोग्रामिंग अर्थ में एक सूची नहीं है (जब तक कि आपका मतलब यह नहीं है कि स्ट्रिंग पात्रों की एक सूची है जिसे आप स्पष्ट रूप से नहीं करते हैं)। ओपी ने अपने डेटा को "आईडी की एक सूची" (या यहां तक ​​कि "[..] की एक सूची") के रूप में वर्णित किया है, इसका मतलब है कि वे कुछ बिंदुओं पर इस डेटा को व्यक्तिगत वस्तुओं के रूप में संभाल रहे हैं।
फ्लोटर

10
@ फ़्लैटर: लेकिन यह एक सूची है। आपको यह सुनिश्चित करने में सक्षम होना चाहिए कि (विभिन्न) एक HTML सूची, एक मार्कडाउन सूची, एक JSON सूची आदि के रूप में आइटम को ठीक से प्रदर्शित करने के लिए (विभिन्न तरीके से) एक वेब पेज, एक सादा पाठ दस्तावेज़, एक मोबाइल। एप्लिकेशन ... और आप वास्तव में सादे पाठ के साथ ऐसा नहीं कर सकते।
केविन

12
@ केविन अगर आपका लक्ष्य है, तो यह बहुत आसानी से और आसानी से एक तालिका में सामग्री को संग्रहीत करके हासिल किया जाता है! उल्लेख नहीं है कि, बाद में, लोग ... ओह, मुझे नहीं पता, कहते हैं, अनुशंसित विकल्प की इच्छा है , या बिना किसी मूंगफली, या ग्लूटेन, या पशु प्रोटीन के सभी व्यंजनों की तलाश में मूर्खतापूर्ण कुछ ...
Dan ब्रॉन

10
@ डैनब्रोन: YAGNI। अभी हम केवल एक सूची का उपयोग कर रहे हैं क्योंकि यह UI तर्क को आसान बनाता है। यदि हमें व्यावसायिक तर्क परत में सूची-प्रकार के व्यवहार की आवश्यकता है या आवश्यकता है, तो इसे एक अलग तालिका में सामान्यीकृत किया जाना चाहिए। टेबल्स और जॉन्स आवश्यक रूप से महंगे नहीं हैं, लेकिन वे स्वतंत्र नहीं हैं, और वे तत्व आदेश के बारे में प्रश्न लाते हैं ("क्या हम सामग्री के आदेश की परवाह करते हैं?") और आगे सामान्यीकरण ("क्या आप '3 अंडे' चालू करने जा रहे हैं?" में ('अंडे', 3)? 'नमक के बारे में क्या, स्वाद के लिए', वह ('नमक', NULL)? '') है।
केविन

7
@ केविन: YAGNI यहां काफी गलत है। आपने स्वयं कई (HTML, markdown, JSON) तरीके से सूची को बदलने में सक्षम होने की आवश्यकता का तर्क दिया और इस प्रकार यह तर्क दे रहे हैं कि आपको सूची के अलग-अलग तत्वों की आवश्यकता है । जब तक डेटा स्टोरेज और "लिस्ट हैंडलिंग" एप्लिकेशन दो एप्लिकेशन हैं जिन्हें स्वतंत्र रूप से विकसित किया जाता है (और ध्यान दें कि अलग-अलग एप्लिकेशन लेयर्स! = अलग-अलग एप्लिकेशन), डेटाबेस संरचना को हमेशा एक प्रारूप में डेटा को स्टोर करने के लिए बनाया जाना चाहिए जो इसे आसानी से उपलब्ध हो। - अतिरिक्त पार्सिंग / रूपांतरण तर्क से परहेज करते हुए।
फ्लोटर

22

क्या आप का वर्णन कर रहे हैं के बीच अपने मामले में के रूप में संबंध एक "के कई के लिए कई" में जाना जाता है, Personऔर Task। यह आमतौर पर एक तीसरी तालिका का उपयोग करके कार्यान्वित किया जाता है, जिसे कभी-कभी "लिंक" या "क्रॉस-संदर्भ" तालिका कहा जाता है। उदाहरण के लिए:

create table person (
    person_id integer primary key,
    ...
);

create table task (
    task_id integer primary key,
    ...
);

create table person_task_xref (
    person_id integer not null,
    task_id integer not null,
    primary key (person_id, task_id),
    foreign key (person_id) references person (person_id),
    foreign key (task_id) references task (task_id)
);

2
task_idयदि आप कार्य द्वारा फ़िल्टर किए गए क्वेरी कर रहे हैं, तो आप पहली बार एक इंडेक्स भी जोड़ना चाह सकते हैं।
jpmc26

1
ब्रिज टेबल के रूप में भी जानते हैं। इसके अलावा, काश मैं आपको पहचान स्तंभ न होने के लिए एक अतिरिक्त धनराशि दे सकता था, हालांकि मैं प्रत्येक स्तंभ पर एक सूचकांक की सिफारिश करूंगा।
जोर्मेनो

13

... यह कभी नहीं (या लगभग कभी नहीं) ठीक है एक क्षेत्र में आईडी या इस तरह की एक सूची को स्टोर करने के लिए

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

चूंकि एक "सूची" है, परिभाषा के अनुसार, छोटे तत्वों (वस्तुओं) से बना है, यह यहां मामला नहीं है और आपको डेटा को सामान्य करना चाहिए।

... अगर मैं इन कार्यों को व्यक्तिगत रूप से "व्यक्ति" में सहेजता हूं, तो मुझे दर्जनों डमी "टास्किड" कॉलम रखने होंगे ...

नहीं, आपके पास व्यक्ति और कार्य के बीच एक अंतर तालिका (उर्फ कमजोर इकाई) में कुछ पंक्तियाँ होंगी। डेटाबेस बहुत सारी पंक्तियों के साथ काम करने में अच्छे हैं; वे वास्तव में बहुत बार [बार-बार] कॉलम के साथ काम करने में बकवास कर रहे हैं।

Whatsisname द्वारा दिया गया अच्छा स्पष्ट उदाहरण।


4
वास्तविक जीवन प्रणाली बनाते समय "कभी मत कहो" द्वारा जीना एक बहुत अच्छा नियम है।
l0b0

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

4

यह कुछ पूर्व-परिकलित फ़ील्ड में वैध हो सकता है।

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

उदाहरण के लिए, UI में आप ग्रिड दृश्य का उपयोग करके इस सूची को दिखाना चाहते हैं, जहाँ प्रत्येक पंक्ति पूर्ण विवरण (पूर्ण सूचियों के साथ) को खोलने के बाद खोल सकती है:

REGISTERED USER LIST
+------------------+----------------------------------------------------+
|Name              |Top 3 most visited tags                             |
+==================+====================================================+
|Peter             |Design, Fitness, Gifts                              |
+------------------+----------------------------------------------------+
|Lucy              |Fashion, Gifts, Lifestyle                           |
+------------------+----------------------------------------------------+

जब ग्राहक नए लेख या निर्धारित कार्य पर जाता है तो आप ट्रिगर द्वारा दूसरा कॉलम अपडेट कर रहे हैं।

आप इस तरह के क्षेत्र को खोज (सामान्य पाठ के रूप में) के लिए भी उपलब्ध करा सकते हैं।

ऐसे मामलों के लिए, सूची रखना वैध है। आपको केवल अधिकतम फ़ील्ड लंबाई से अधिक के मामले पर विचार करने की आवश्यकता है।


इसके अलावा, यदि आप Microsoft Access का उपयोग कर रहे हैं, तो प्रस्तावित बहु-स्तरीय फ़ील्ड एक और विशेष उपयोग के मामले हैं। वे स्वचालित रूप से आपकी सूचियों को एक क्षेत्र में संभालते हैं।

लेकिन आप हमेशा अन्य उत्तरों में दिखाए गए मानक सामान्यीकृत रूप में वापस आ सकते हैं।


सारांश: डेटाबेस के सामान्य रूप सैद्धांतिक मॉडल हैं जो डेटा मॉडलिंग के महत्वपूर्ण पहलुओं को समझने के लिए आवश्यक हैं। लेकिन निश्चित रूप से सामान्यीकरण डेटा को पुनर्प्राप्त करने के लिए प्रदर्शन या अन्य लागत को ध्यान में नहीं रखता है। यह उस सैद्धांतिक मॉडल के दायरे से बाहर है। लेकिन सूची या अन्य पूर्व-गणना (और नियंत्रित) डुप्लिकेट को अक्सर व्यावहारिक कार्यान्वयन द्वारा आवश्यक होता है।

उपरोक्त के प्रकाश में, व्यावहारिक कार्यान्वयन में, क्या हम क्वेरी को सामान्य सामान्य रूप पर निर्भर करना पसंद करेंगे और 20-सेकंड या समतुल्य क्वेरी को पूर्व-परिकलित मानों पर निर्भर करना पसंद करेंगे जो 0.08 s पर ले जाता है? धीमेपन का आरोप लगाने के लिए कोई भी उनके सॉफ़्टवेयर उत्पाद को पसंद नहीं करता है।


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

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

@LorenPechtel वास्तव में, यह अभी भी एक बुरा कारण होगा ... कैश डेटा को इंटरमीडिएट कैश स्टोर में रखा जाना चाहिए, और जबकि कैश अभी भी मान्य है, उस क्वेरी को कभी भी मुख्य DB को हिट नहीं करना चाहिए।
तीज्रा

1
@Tezra नहीं, मैं कह रहा हूं कि कभी-कभी एक माध्यमिक तालिका से डेटा के एक टुकड़े की आवश्यकता होती है, जो मुख्य रिकॉर्ड में एक कॉपी डालने के लिए समझ में आता है। (उदाहरण है कि मैंने किया है - कर्मचारी तालिका किसी भी वास्तविक गणना घड़ी-इन / घड़ी से बाहर रिकॉर्ड के साथ तालिका से आता है में पिछली बार और पिछली बार बाहर भी शामिल है वे केवल प्रदर्शन प्रयोजनों के लिए उपयोग किया जाता है,।।)
लोरेन Pechtel

0

दो टेबल दिए; हम उन्हें व्यक्ति और टास्क कहेंगे, जिनमें से प्रत्येक की अपनी आईडी (पर्सोइड, टास्कआईडी) है ... मूल विचार यह है कि उन्हें एक साथ बांधने के लिए एक तीसरी तालिका बनाई जाए। हम इस तालिका को PersonToTask कहेंगे। कम से कम इसकी अपनी आईडी होनी चाहिए, साथ ही दो अन्य लोगों की भी जब यह किसी को किसी कार्य को सौंपने की बात आती है; अब आपको व्यक्ति तालिका को अद्यतन करने की आवश्यकता नहीं होगी, आपको बस एक नई लाइन को सम्मिलित करने की आवश्यकता है। और रखरखाव आसान हो जाता है- टास्कआईडी के आधार पर एक टास्क को डिलीट करने की जरूरत है बस एक DELETE हो जाता है, पर्सन टेबल को अपडेट नहीं करना है और यह संबंधित है

CREATE TABLE dbo.PersonToTask (
    pttID INT IDENTITY(1,1) NOT NULL,
    PersonID INT NULL,
    TaskID   INT NULL
)

CREATE PROCEDURE dbo.Task_Assigned (@PersonID INT, @TaskID INT)
AS
BEGIN
    INSERT PersonToTask (PersonID, TaskID)
    VALUES (@PersonID, @TaskID)
END

CREATE PROCEDURE dbo.Task_Deleted (@TaskID INT)
AS
BEGIN
    DELETE PersonToTask  WHERE TaskID = @TaskID
    DELETE Task          WHERE TaskID = @TaskID
END

कैसे एक साधारण रिपोर्ट या जो सभी को एक कार्य सौंपा गया है?

CREATE PROCEDURE dbo.Task_CurrentAssigned (@TaskID INT)
AS
BEGIN
    SELECT PersonName
    FROM   dbo.Person
    WHERE  PersonID IN (SELECT PersonID FROM dbo.PersonToTask WHERE TaskID = @TaskID)
END

आप निश्चित रूप से बहुत कुछ कर सकते हैं; यदि आप कार्यदिवस और कार्य-सूची के लिए DateTime फ़ील्ड्स जोड़ते हैं, तो TimeReport किया जा सकता है। यह सब आप पर निर्भर है


0

यदि आपके पास मानव पठनीय प्राथमिक कुंजी है तो यह काम कर सकता है और तालिका संरचना के ऊर्ध्वाधर प्रकृति से निपटने के बिना कार्य की सूची # चाहता है। पहली तालिका पढ़ने के लिए बहुत आसान है।

------------------------  
Employee Name | Task 
Jack          |  1,2,5
Jill          |  4,6,7
------------------------

------------------------  
Employee Name | Task 
Jack          |  1
Jack          |  2
Jack          |  5
Jill          |  4
Jill          |  6
Jill          |  7
------------------------

तब सवाल यह होगा: क्या कार्य सूची को मांग पर संग्रहीत या उत्पन्न किया जाना चाहिए, जो काफी हद तक आवश्यकताओं पर निर्भर करेगा जैसे: सूची की कितनी बार आवश्यकता है, कितनी सटीक डेटा पंक्तियाँ मौजूद हैं, डेटा का उपयोग कैसे किया जाएगा, आदि। .. जिसके बाद उपयोगकर्ता अनुभव और बैठक की आवश्यकताओं के लिए व्यापार के उतार-चढ़ाव का विश्लेषण किया जाना चाहिए।

उदाहरण के लिए 2 पंक्तियों बनाम 2 पंक्तियों को उत्पन्न करने वाली क्वेरी चलाने के लिए याद करने में लगने वाले समय की तुलना करना। यदि इसमें लंबा समय लगता है और उपयोगकर्ता को अद्यतित सूची (* प्रति दिन 1 से कम बदलाव की उम्मीद) की आवश्यकता नहीं होती है, तो इसे संग्रहीत किया जा सकता है।

या यदि उपयोगकर्ता को सौंपे गए कार्यों का एक ऐतिहासिक रिकॉर्ड चाहिए, तो यह भी समझ में आएगा कि सूची संग्रहीत की गई थी या नहीं। तो यह वास्तव में इस बात पर निर्भर करता है कि आप क्या कर रहे हैं, कभी नहीं कहते हैं।


जैसा कि आप कहते हैं, यह सब इस बात पर निर्भर करता है कि डेटा को कैसे प्राप्त किया जाए। यदि आप उपयोगकर्ता नाम से इस तालिका को केवल / कभी भी क्वेरी करते हैं, तो "सूची" फ़ील्ड पूरी तरह से पर्याप्त है। हालाँकि, आप यह पता लगाने के लिए ऐसी तालिका का उपयोग कैसे कर सकते हैं कि टास्क # 1234567 पर कौन काम कर रहा है और फिर भी इसे निष्पादित करता है? बस हर तरह के "फाइंड-एक्स-एनी-इन-द-फील्ड" स्ट्रिंग फ़ंक्शन के कारण इस तरह की क्वेरी / टेबल स्कैन /, क्रॉल करने के लिए चीजों को धीमा कर देगी। ठीक से सामान्यीकृत, ठीक से अनुक्रमित डेटा के साथ, बस ऐसा नहीं होता है।
फिल डब्ल्यू।

0

आप दूसरी तालिका में क्या होना चाहिए, इसे 90 डिग्री से मोड़कर दूसरी तालिका में शामिल करें।

यह एक ऑर्डर टेबल रखने जैसा है, जहां आपके पास itemProdcode1, itemQuantity1, itemPrice1 ... itemProdcode37, itemQuantity37, itemPrice37 है। प्रोग्राम को संभालने के लिए अजीब होने के अलावा आप गारंटी दे सकते हैं कि कल कोई व्यक्ति 38 चीजों का ऑर्डर देना चाहेगा।

यदि 'सूची' वास्तव में एक सूची नहीं है, तो मैं इसे अपने तरीके से करूँगा / करूँगी, जहाँ यह एक पूरी और प्रत्येक व्यक्तिगत पंक्ति वस्तु के रूप में कुछ स्पष्ट और स्वतंत्र इकाई को संदर्भित नहीं करती है। उस मामले में बस यह सब कुछ डेटा प्रकार में भर जाता है जो काफी बड़ा होता है।

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


0

यदि यह "ठीक नहीं है" तो यह काफी बुरा है कि प्रत्येक वर्डप्रेस साइट पर कभी भी एक पंक्ति में wp_usermeta के साथ एक पंक्ति में wp_capabilities है, एक पंक्ति में खारिज की गई_wp_pointers सूची और अन्य ...

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

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