2011-12-30 13 views
5

1 एनएफ विफलता पर विचार करने में, तत्वों के दोहराव वाले समूह, क्या होगा यदि आप दोहराने वाले समूह की संख्या पर सेट सीमा चाहते हैं?क्या यह 1 एनएफ विफलता है?

उदाहरण के लिए, आप चाहते हैं कि एक छात्र के पास केवल 3 फोन नंबर सूचीबद्ध हों। अब और नहीं। निम्नानुसार एक टेबल होने पर 1 एनएफ विफलता माना जाएगा?

Student 1 Phone1 Phone2 Phone3 
Sally  111-1111 222-2222 333-3333 
John   555-5555 999-9999 NULL 

आप एक सीमा बनायेंगे। क्या यह स्वीकार्य, कुशल डेटाबेस डिज़ाइन है?

क्या फ़ोन नंबरों को एक अलग तालिका में रखना बेहतर होगा, क्योंकि 1 एनएफ विफलताओं के लिए कॉल करें? यदि आप अलग-अलग तालिका में थे तो आप प्रति उपयोगकर्ता 3 संख्याओं की सीमा कैसे बनाएंगे?

+1

वहाँ, 1NF में एक उत्कृष्ट लेख @ http://en.wikipedia.org/wiki/First_normal_form#Repeating_groups –

उत्तर

6

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

+2

2NF या 3NF में नहीं है, लेकिन ** यह ** है जो है क्या ओपी पूछ रहा है। – Oded

+0

क्या एसक्यूएल सर्वर ट्रिगर्स का समर्थन करता है? \ – user

+1

@ user1122200 - आप SQL सर्वर के बारे में क्यों पूछ रहे हैं? आपने MySQL टैग किया है? –

6

1 एनएफ एक पंक्ति में सूचियों को दोहराने पर प्रतिबंध लगाता है। आपका डिजाइन इस का उल्लंघन करती है, और इसलिए होगा निम्नलिखित डिजाइन:

Student  Phones 
'John D' '555-5555, 666-6666, 777-7777' 
'Sally S' '111-1111, 222-2222' 

निम्नलिखित डिजाइन 2NF का उल्लंघन होगा, क्योंकि केवल प्राथमिक कुंजी Name, Phone है, लेकिन Address विशेषता Phone पर निर्भर नहीं करता:

Name  Phone  Address 
'John D' '555-5555' '1 Square Village' 
'John D' '666-6666' '1 Square Village' 
'John D' '777-7777' '1 Square Village' 
'Sally S' '111-1111' '999 Flash City' 
'Sally S' '222-2222' '999 Flash City' 

अगले डिजाइन 3NF का उल्लंघन होगा, क्योंकि AreaName नाम पर निर्भर नहीं करता है, लेकिन केवल क्षेत्र पर:

Name  Area Phone AreaName 
'John D' '555' '5555' '111name' 
'John D' '666' '6666' '666name' 
'John D' '777' '7777' '777name' 
'Sally S' '111' '1111' '111name' 
'Sally S' '222' '2222' '222name' 

भले ही आपका डिज़ाइन 1 एनएफ का उल्लंघन करता है, यह एक उत्कृष्ट विकल्प है। PhoneNumber तालिका जोड़ने की जटिलता शायद ही कभी उचित है।

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

यदि आप अपने समाधान से चिपके रहते हैं, तो आप केवल तीन कॉलम अपडेट कर सकते हैं। बचाया समय वास्तविक सुविधाओं पर खर्च किया जा सकता है! या यहां तक ​​कि स्टैक ओवरफ़्लो पर लंबे उत्तरों को लिखना।

+0

लॉल। तो ऐसा लगता है कि 1 एनएफ विफलता तब भी हो सकती है जब दोहराने वाले समूहों की संख्या पर कोई सीमा न हो, न केवल उन समूहों को दोहराने के लिए जहां कोई निर्धारित सीमा नहीं है। – user

+1

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

+0

सही। सामान्य प्रस्तुतियां "रिलेशनल बीजगणित" से आती हैं, एक अच्छी शुरुआत के लिए [स्टैनफोर्ड मुक्त वर्ग] (http://www.db-class.org/) देखें। मैं कहूंगा कि सामान्य रूप एक अच्छा उपकरण है, लेकिन आपको लागत और लाभ का वजन करना होगा, और इसे अंधाधुंध लागू नहीं करना होगा। – Andomar

1

उपयोगकर्ता 1122200, मान लीजिए कि आपका डेटाबेस डिज़ाइन बढ़ता है। और आपको प्रत्येक फोन नंबर पर कुछ डेटा असाइन करने की आवश्यकता है (जैसे फोन स्थान: 'घर', 'काम', ...)। इस मामले में आप एक फोन टेबल चाहेंगे। इसके अलावा, supose है कि आप (जब कोई कॉल पिज्जा झोपड़ी या टैक्सियों सेवाओं की तरह) फोन नंबर से छात्रों को खोजने की जरूरत है, यह एक अच्छी तरह से सामान्यीकृत डिजाइन में अधिक आसान एक प्रश्न है कि इस क्वेरी:

select * 
from students 
where 
    Phone1 = '91112223' or 
    Phone2 = '91112223' or 
    Phone3 = '91112223' 
3

आपका संबंध चर (relvar) वास्तव में 1 एनएफ का उल्लंघन करता है, लेकिन शायद आप जिस कारण की उम्मीद कर रहे हैं उसके लिए नहीं: यह शून्य की मौजूदगी है जो 1 एनएफ का उल्लंघन करती है। अगर आपको लगता है कि आपके रिवर में दोहराने वाला समूह है, तो फिर से सोचें।

पहला सामान्य रूप, या बस "सामान्यीकृत", संबंधपरक मॉडल के लिए न्यूनतम आवश्यकता है।क्रिस तिथि उद्धृत करने के लिए:

परिभाषा के अनुसार, एक शून्य एक मूल्य नहीं है। यह इस प्रकार है: एक "प्रकार" जो में एक शून्य एक प्रकार नहीं है (क्योंकि प्रकारों में मान होते हैं); एक "ट्यूपल" जिसमें शून्य है, एक टुपल नहीं है (क्योंकि टुपल्स में मान होते हैं); एक "संबंध" जिसमें शून्य होता है वह संबंध नहीं है (क्योंकि संबंध में टुपल्स होते हैं, और टुपल्स में नल नहीं होते हैं)। वास्तव में, सभी के सबसे मौलिक संबंध सिद्धांत का उल्लंघन करते हैं, जैसे सूचना सिद्धांत। इन सबके नेट यह है कि अगरमौजूद हैं, तो हम निश्चित रूप से संबंध मॉडल (मुझे नहीं पता कि हम किस बारे में बात कर रहे हैं, लेकिन यह संबंध मॉडल नहीं है); पूरी इमारत टूट जाती है, और सभी दांव बंद हो जाते हैं।

समूह दोहराए जाने के बारे में बिंदु और 1 एनएफ व्याख्या करने के लिए एक मुश्किल है और मैं कोशिश नहीं करूंगा। इसके बजाय, मैं आपको Facts and Fallacies about First Normal Form पढ़ने के लिए आग्रह करता हूं, विशेष रूप से "पुनरावृत्ति समूहों की अस्पष्टता" अनुभाग।

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

+0

इस संबंध में एक दोहराना समूह, फोन नंबर समूह शामिल है। सीधे शब्दों में कहें, यह उपर्युक्त संबंध से स्पष्ट रूप से देखा जा सकता है। नल मूल्य की उपस्थिति इसे 1 एनएफ उल्लंघन को और भी अधिक बनाती है। यहां मुख्य फोकस उन तत्वों के समूह का निर्माण है जहां सीमित संख्या वांछित है। – user

+1

@user: मुझे क्रमशः 'फोन 1', 'फोन 2' और' फोन 3 'नामक तीन विशिष्ट विशेषताओं को देखा गया है; उन्हें 'होम_फोन', 'मोबाइल_फोन' और 'वर्क_फोन' नाम दिया जा सकता था, नाम उनके प्रकार के लिए महत्वपूर्ण नहीं हैं। मुझे कोई "फोन नंबर समूह" नहीं दिख रहा है। – onedaywhen

+0

एक तार्किक डेटा मॉडल में, यदि किसी इकाई में कॉलम में डेटा प्रकार समान हैं, तो वे परिभाषा समूह द्वारा परिभाषित हैं। यह हॉबी 1, हॉबी 2, हॉबी 3 या स्पोर्ट 1, स्पोर्ट 2, स्पोर्ट 3 पर लागू होगा। – user

1

यदि आप अलग-अलग तालिका में थे तो प्रति उपयोगकर्ता 3 संख्याओं की सीमा कैसे बनाएंगे?

मुझे लगता है कि एक छात्र के पास शून्य, एक दो या तीन फोन नंबर हो सकते हैं।

अपने एसक्यूएल उत्पाद समर्थित पूर्ण SQL-92 हैं:

CREATE TABLE Students 
(
student_name VARCHAR(20) NOT NULL UNIQUE 
); 

CREATE TABLE StudentPhonebook 
(
student_name VARCHAR(20) NOT NULL 
    REFERENCES Students (student_name), 
phone_number CHAR(8) NOT NULL 
    CHECK (phone_number LIKE '[0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]'), 
UNIQUE (student_name, phone_number) 
); 

CREATE ASSERTION students_max_three_phone_numbers 
    CHECK (
      NOT EXISTS (
         SELECT * 
         FROM (
           SELECT student_name, COUNT(*) AS tally 
           FROM StudentPhonebook 
           GROUP 
            BY student_name 
          ) AS DT1 
         WHERE tally > 3 
        ) 
     ); 

MySQL किसी भी स्वाद के CHECK का समर्थन नहीं करता और कोई एसक्यूएल उत्पाद जैसे प्रक्रियात्मक कोड का उपयोग कर CREATE ASSERTION तो ऊपर की कमी शायद लिखा होना चाहिए का समर्थन करता है चलाता है।

ब्याज में से

, यदि आपका एसक्यूएल उत्पाद समर्थित पंक्ति-स्तर CHECK की कमी (अधिकांश के रूप में करते हैं), एक एक BETWEEN 1 AND 3 बाधा के साथ एक occurrence विशेषता का उपयोग कर सकते हैं तो जैसे एक प्रमुख बाधा में यह विशेषता शामिल

CREATE TABLE StudentPhonebook 
(
student_name VARCHAR(20) NOT NULL 
    REFERENCES Students (student_name), 
phone_number CHAR(8) NOT NULL 
    CHECK (phone_number LIKE '[0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]'), 
occurrence INTEGER DEFAULT 1 NOT NULL 
    CHECK (occurrence BETWEEN 1 AND 3), 
UNIQUE (student_name, phone_number), 
UNIQUE (student_name, occurrence) 
); 
+1

MySQL में, 'जांच (1 और 3 के बीच घटना)' बाधा को एक पंक्ति तालिका के साथ 'पंक्ति कुंजी' के साथ अनुकरण किया जा सकता है जिसमें बिल्कुल 3 पंक्तियां होंगी। –