नॉर्मलाइज़ेशन के फायदे और नुकसान
नॉर्मलाइज़ेशन कोई जादुई समाधान नहीं है—यह महत्वपूर्ण समस्याएँ सुलझाता है, लेकिन नई चुनौतियाँ भी लाता है, खासकर SQL क्वेरी की जटिलता के आसपास। यहाँ देखें कि आप क्या पाते हैं और क्या छोड़ते हैं जब आप डेटाबेस को नॉर्मलाइज़ करते हैं।
नॉर्मलाइज़ेशन के फायदे
- कम पुनरावृत्ति का मतलब है कि आपका डेटाबेस हर तथ्य को केवल एक बार सहेजता है—स्टोरेज लागत घटती है और सिंक संबंधी समस्याएँ खत्म होती हैं। जब ग्राहक डेटा दर्जनों तालिकाओं में बिखरे होने के बजाय एक ही तालिका में रहता है, तो पता अपडेट करना एक पंक्ति का काम बन जाता है। संबंधित तालिकाओं में खोज-खबर नहीं, छूटे अपडेट्स की चिंता नहीं, और रिपोर्टों में असंगत डेटा नहीं।
- डेटा स्थिरता स्वचालित हो जाती है जब केवल एक ही स्रोत सत्य का होता है। आपकी एप्लिकेशन परस्पर-विरोधी जानकारी नहीं दिखा सकती क्योंकि ऐसी जानकारी पहले स्थान पर मौजूद ही नहीं होगी।
- अपडेट तेज़ और भरोसेमंद हो जाते हैं क्योंकि आप दर्जनों की बजाय एक पंक्ति बदलते हैं। नए ग्राहक को एक बार इन्सर्ट करें, बाकी जगह फॉरेन कीज़ से संदर्भित करें। किसी ऑर्डर को डिलीट करें, बिना संबंधित तालिकाओं में अनाथ डेटा की चिंता के।
- सुरक्षा नियंत्रण सरल हो जाते हैं जब संवेदनशील डेटा की स्पष्ट सीमाएँ होती हैं। ग्राहक भुगतान जानकारी एक विशिष्ट तालिका में विशिष्ट एक्सेस नियंत्रणों के साथ रहती है। अप्रत्याशित स्थानों में क्रेडिट कार्ड नंबरों के छिपे होने की चिंता नहीं।
- स्केलेबिलिटी बेहतर होती है क्योंकि नॉर्मलाइज़्ड तालिकाएँ छोटी और अधिक फोकस्ड होती हैं। छोटे टेबल्स पर इंडेक्स बेहतर काम करते हैं। आप डेटा को तार्किक रूप से पार्टिशन कर सकते हैं, बिना शार्ड्स में जानकारी डुप्लीकेट किए।
- टीम सहयोग अधिक सहज हो जाता है जब सभी समझते हैं कि डेटा कहाँ रहता है। नए डेवलपर्स स्कीमा में तेज़ी से नेविगेट कर सकते हैं। डेटाबेस एडमिनिस्ट्रेटर्स आत्मविश्वास के साथ प्रदर्शन अनुकूलित कर सकते हैं। बिज़नेस एनालिस्ट विश्वसनीय क्वेरी लिख सकते हैं, डेटा गुणवत्ता पर संदेह किए बिना।
- बैकअप और रिकवरी स्ट्रैटेजी अधिक साफ़-सुथरी होती हैं क्योंकि संबंधित डेटा असंबद्ध कई तालिकाओं में फैला नहीं रहता। फॉरेन की कॉन्स्ट्रेंट्स सुनिश्चित करते हैं कि आप ऐसी आंशिक जानकारी रिस्टोर न कर दें जो रेफ़रेन्शियल इंटेग्रिटी तोड़ दे।
नॉर्मलाइज़ेशन के नुकसान और चुनौतियाँ
- क्वेरी जटिलता बढ़ती है जब सरल सवालों के जवाब के लिए कई जॉइन्स की ज़रूरत पड़ती है। किसी ग्राहक का ऑर्डर इतिहास प्रोडक्ट नामों के साथ देखना चाहते हैं? डीनॉर्मलाइज़्ड टेबल में यह एक क्वेरी है। नॉर्मलाइज़्ड डेटाबेस में, आपको customers, orders, order items, और products तालिकाओं को जोड़ना पड़ेगा। अधिक जॉइन्स का मतलब है गलती की अधिक गुंजाइश और धीमा निष्पादन।
- प्रदर्शन प्रभावित हो सकता है जब आप बार-बार तालिकाएँ जोड़ते हैं, बजाय एक ही चौड़ी तालिका से पढ़ने के। हर जॉइन ओवरहेड जोड़ता है, खासकर जब डेटाबेस को अलग-अलग स्टोरेज लोकेशंस से डेटा एक्सेस करना पड़े।
- डेवलपमेंट समय बढ़ता है क्योंकि डेवलपर्स को क्वेरी लिखने से पहले तालिका संबंध समझने होते हैं। जो पहले एक सरल
SELECTथा, वह अब उचित फॉरेन की हैंडलिंग के साथ मल्टी-टेबलJOINबन जाता है। - ओवर-नॉर्मलाइज़ेशन कृत्रिम जटिलता पैदा करता है जब आप उस डेटा को अलग-अलग बाँटते हैं जो स्वाभाविक रूप से साथ रहना चाहिए। यदि आप किसी व्यक्ति के पूरे नाम को अलग-अलग प्रथम, मध्य, और अंतिम नाम तालिकाओं में नॉर्मलाइज़ कर देते हैं, तो शायद आप बहुत दूर चले गए हैं।
यह एक वास्तविक उदाहरण है: एक ई-कॉमर्स साइट ने प्रोडक्ट कैटेगरीज़ को छह स्तरों की पदानुक्रम में नॉर्मलाइज़ किया। "सभी इलेक्ट्रॉनिक्स दिखाएँ" जैसी सरल क्वेरीज़ सात-टेबल जॉइन बन गईं जो मिलीसेकंड्स के बजाय सेकंड्स लेती थीं। सैद्धांतिक शुद्धता व्यावहारिक दर्द के लायक नहीं थी।
- रीड-हैवी एप्लिकेशन प्रभावित होते हैं जब नॉर्मलाइज़ेशन लिखने के लिए अनुकूलित करता है, लेकिन अधिकतर ऑपरेशन पढ़ने के होते हैं। सोशल मीडिया फ़ीड्स, एनालिटिक्स डैशबोर्ड्स, और रिपोर्टिंग सिस्टम अक्सर कुछ रणनीतिक डीनॉर्मलाइज़ेशन से बेहतर प्रदर्शन करते हैं।
- मेंटेनेंस ओवरहेड बढ़ता है जैसे-जैसे तालिकाओं की संख्या बढ़ती है। अधिक तालिकाएँ मतलब अधिक इंडेक्स बनाए रखना, अधिक फॉरेन की कॉन्स्ट्रेंट्स वैलिडेट करना, और अधिक जटिल बैकअप प्रक्रियाएँ।
कुंजी आपके उपयोग मामले के लिए सही संतुलन खोजना है—इतना नॉर्मलाइज़ करें कि डेटा अखंडता की समस्याएँ न हों, पर इतना नहीं कि प्रदर्शन और डेवलपर उत्पादकता की बलि देनी पड़े।
प्रदर्शन और अनुकूलन
नॉर्मलाइज़ेशन अलग-अलग प्रकार की प्रणालियों को अलग-अलग तरह से प्रभावित करता है—जो ट्रांज़ैक्शनल सिस्टम्स के लिए फ़ायदेमंद है, वह विश्लेषणात्मक सिस्टम्स के लिए नुकसानदेह हो सकता है। अपने वर्कलोड पैटर्न के आधार पर प्रदर्शन कैसे अनुकूलित करें, यह यहाँ है।
OLTP और OLAP सिस्टम्स के लिए विचार
OLTP सिस्टम्स नॉर्मलाइज़ेशन से लाभान्वित होते हैं क्योंकि वे कई छोटे, केंद्रित ट्रांज़ैक्शन्स को संभालते हैं जो विशिष्ट रिकॉर्ड्स को संशोधित करते हैं।
एक ई-कॉमर्स एप्लिकेशन में, जब कोई ग्राहक अपना शिपिंग पता अपडेट करता है, तो आप customers तालिका में एक पंक्ति बदलते हैं। नॉर्मलाइज़ेशन के बिना, आपको customers, orders, shipping addresses, और billing addresses तालिकाओं में पता जानकारी अपडेट करनी पड़ती—यानी अधिक लिखाई और अधिक लॉक कॉन्टेंशन।
नॉर्मलाइज़्ड तालिकाएँ लॉक कॉन्टेंशन कम करती हैं क्योंकि ट्रांज़ैक्शन्स छोटे, अधिक फोकस्ड डेटा सेट्स को प्रभावित करते हैं। जब “यूज़र A” अपनी प्रोफ़ाइल अपडेट करता है जबकि “यूज़र B” ऑर्डर देता है, तो संभव है कि वे पूरी तरह अलग तालिकाओं को छू रहे हों। इससे बेहतर कंकरेन्सी और तेज़ ट्रांज़ैक्शन प्रोसेसिंग मिलती है।
नॉर्मलाइज़्ड सिस्टम्स में लिखने की क्रियाएँ एटॉमिक और पूर्वानुमेय हो जाती हैं। नया ऑर्डर इन्सर्ट करें—orders तालिका और order_items तालिका में लिखें। यदि कोई भी ऑपरेशन विफल होता है, तो आप साफ़-सुथरे ढंग से रोलबैक कर सकते हैं, डीनॉर्मलाइज़्ड संरचनाओं में बिखरे आंशिक अपडेट्स की चिंता किए बिना।
OLAP सिस्टम्स की कहानी अलग है—उन्हें बड़े डेटा सेट्स पर तेज़ रीड्स चाहिए और वे अक्सर अनेक संबंधित तालिकाओं से डेटा एग्रीगेट करते हैं।
एक सेल्स एनालिटिक्स क्वेरी पर विचार करें: "पिछले दो वर्षों के लिए प्रोडक्ट कैटेगरी अनुसार मासिक राजस्व दिखाएँ।" नॉर्मलाइज़्ड सिस्टम में orders, order items, products, और categories तालिकाओं को जोड़ना पड़ेगा—संभावित रूप से लाखों पंक्तियाँ और महँगी एग्रीगेशंस।
प्री-कैल्कुलेटेड मासिक टोटल्स वाली डीनॉर्मलाइज़्ड डेटा वेयरहाउस तालिका वही सवाल एक सरल GROUP BY क्वेरी से हल कर देती है। समझौता है स्टोरेज स्पेस और अपडेट जटिलता, बदले में बहुत तेज़ क्वेरी प्रदर्शन।
हाइब्रिड दृष्टिकोण अच्छा काम करता है जब आपको ट्रांज़ैक्शनल अखंडता और विश्लेषणात्मक प्रदर्शन दोनों चाहिए। डेटा अखंडता के लिए अपने OLTP सिस्टम को नॉर्मलाइज़्ड रखें, फिर तेज़ रिपोर्टिंग के लिए डीनॉर्मलाइज़्ड OLAP सिस्टम्स में ETL करें।
नॉर्मलाइज़ेशन के ओवरहेड को कम करने की तकनीकें
- उचित इंडेक्सिंग रणनीति नॉर्मलाइज़्ड डेटाबेस में जॉइन के प्रदर्शन को बदल देती है। फॉरेन की कॉलम्स पर हमेशा इंडेक्स चाहिए। जब आप customers और orders तालिकाओं को customer ID पर जोड़ते हैं, तो दोनों तालिकाओं में उस कॉलम पर इंडेक्स होना चाहिए। इनके बिना, डेटाबेस फुल टेबल स्कैन करता है जो प्रदर्शन को मार देता है।
-- Must-have indexes for normalized tables
CREATE INDEX idx_orders_customer_id ON orders(customer_id);
CREATE INDEX idx_order_items_order_id ON order_items(order_id);
CREATE INDEX idx_order_items_product_id ON order_items(product_id);
- कॉम्पोज़िट इंडेक्स नॉर्मलाइज़्ड स्कीमाज़ में आम मल्टी-कॉलम क्वेरीज़ में मदद करते हैं:
-- For queries filtering by customer and date range
CREATE INDEX idx_orders_customer_date ON orders(customer_id, order_date);
- क्वेरी रिज़ल्ट कैशिंग अक्सर एक्सेस की जाने वाली डेटा संयोजनों के लिए दोहराए हुए जॉइन ओवरहेड को समाप्त करती है। Redis या Memcached महँगी मल्टी-टेबल क्वेरीज़ के प्री-कम्प्यूटेड परिणाम सहेज सकते हैं।
- डेटाबेस कनेक्शन पूलिंग उन एप्लिकेशन के लिए कनेक्शन स्थापित करने के ओवरहेड को घटाती है जो कई छोटी, नॉर्मलाइज़्ड क्वेरीज़ करती हैं।
- मैटीरियलाइज़्ड व्यूज़ जटिल जॉइन्स को प्री-कम्प्यूट कर परिणामों को भौतिक तालिकाओं के रूप में सहेजती हैं:
-- Pre-computed customer order summary
CREATE MATERIALIZED VIEW customer_order_summary AS
SELECT
c.customer_id,
c.name,
COUNT(o.order_id) as total_orders,
SUM(o.total_amount) as lifetime_value
FROM customers c
LEFT JOIN orders o ON c.customer_id = o.customer_id
GROUP BY c.customer_id, c.name;
- हॉरिज़ॉन्टल शार्डिंग नॉर्मलाइज़्ड डेटा के साथ अच्छा काम करता है क्योंकि तालिका संबंध प्राकृतिक शार्डिंग सीमाएँ प्रदान करते हैं। customer_id के आधार पर शार्ड करें और संबंधित ऑर्डर डेटा साथ रहता है।
- रीड रेप्लिकाज़ विश्लेषणात्मक क्वेरीज़ को ट्रांज़ैक्शनल वर्कलोड्स से अलग संभालती हैं। जटिल रिपोर्टिंग क्वेरीज़ को रीड-ओनली रेप्लिकाज़ पर रूट करें, जबकि लिखाई प्राइमरी डेटाबेस पर रखें।
- डेटाबेस-विशिष्ट अनुकूलन बड़ा फ़र्क़ डालते हैं:
- PostgreSQL: धीमे जॉइन्स की पहचान के लिए
EXPLAIN ANALYZEका उपयोग करें, sort ऑपरेशंस के लिए work_mem ट्यून करें - MySQL: दोहराए हुए
SELECTस्टेटमेंट्स के लिए क्वेरी कैश सक्षम करें,JOINबफ़र साइज़ अनुकूलित करें - SQL Server: मिसिंग इंडेक्सेस की पहचान के लिए क्वेरी एक्ज़िक्यूशन प्लान्स का उपयोग करें, बड़ी तालिकाओं के लिए पेज कंप्रेशन सक्षम करें
- PostgreSQL: धीमे जॉइन्स की पहचान के लिए
कुंजी है अनुकूलन से पहले मापना। अपनी वास्तविक क्वेरीज़ को प्रोफ़ाइल करें ताकि बॉटलनेक्स मिलें, फिर अनुमान लगाने के बजाय लक्षित समाधान लागू करें।
डीनॉर्मलाइज़ेशन: रणनीतिक समझौते
कभी-कभी नॉर्मलाइज़ेशन नियम तोड़ना समझदारी होती है—जब पढ़ने का प्रदर्शन, पूर्ण डेटा संगठन से अधिक मायने रखता है। यहाँ जानें कब और कैसे डीनॉर्मलाइज़ करें, बिना मेंटेनेंस का सिरदर्द बनाए।
- महँगे जॉइन्स वाले रीड-हैवी एप्लिकेशन रणनीतिक डीनॉर्मलाइज़ेशन के प्रमुख उम्मीदवार होते हैं।
- रीयल-टाइम डैशबोर्ड्स और एनालिटिक्स अक्सर प्रदर्शन लक्ष्यों को पाने के लिए डीनॉर्मलाइज़्ड डेटा की आवश्यकता होती है। जब एग्ज़ीक्यूटिव्स हर कुछ सेकंड में अपडेट होती लाइव सेल्स मैट्रिक्स देखना चाहते हैं, तो आप नॉर्मलाइज़्ड तालिकाओं में जटिल एग्रीगेशंस वहन नहीं कर सकते।
- ई-कॉमर्स प्रोडक्ट कैटलॉग्स अक्सर कैटेगरी जानकारी को डीनॉर्मलाइज़ करते हैं। products → subcategories → categories → main_categories को जोड़ने के बजाय, कई साइटें हर प्रोडक्ट के साथ पूरा कैटेगरी पाथ सहेजती हैं: "Electronics > Computers > Laptops > Gaming."
- आम डीनॉर्मलाइज़ेशन तकनीकें शामिल हैं:
- कम्प्यूटेड वैल्यूज़ सहेजना: रनिंग टोटल्स, काउंट्स, या एवरेजेस रखें जो अन्यथा एग्रीगेशन क्वेरीज़ माँगते
- पदानुक्रम फ्लैट करना: कैटेगरी पाथ, संगठन संरचनाएँ, या नेस्टेड डेटा को फ्लैट फ़ील्ड्स के रूप में सहेजें
- बार-बार एक्सेस किए जाने वाले डेटा की नकल करना: ग्राहक नामों को ऑर्डर रिकॉर्ड्स में कॉपी करें, प्रोडक्ट टाइटल्स को शॉपिंग कार्ट आइटम्स में
- संबंधित डेटा को पहले से जोड़ना: पोस्ट्स, कमेंट्स, या एक्टिविटी रिकॉर्ड्स के साथ यूज़र प्रोफ़ाइल जानकारी सहेजें
संतुलन आपकी एक्सेस पैटर्न समझने पर निर्भर करता है। यदि आप ग्राहक ऑर्डर सारांश को अपडेट की तुलना में 100 गुना अधिक पढ़ते हैं, तो ऑर्डर रिकॉर्ड्स में ग्राहक का नाम डुप्लीकेट करना समझ में आता है।
लेकिन चयनात्मक रूप से डीनॉर्मलाइज़ करें। अपनी पूरी स्कीमा को फ्लैट न करें क्योंकि एक रिपोर्ट धीमी चलती है—उस एक रिपोर्ट को ठीक करें, बाकी को नॉर्मलाइज़्ड रखें।
नॉर्मलाइज़्ड से शुरू करें, फिर वास्तविक प्रदर्शन समस्याओं के आधार पर डीनॉर्मलाइज़ करें। समय से पहले डीनॉर्मलाइज़ेशन अपडेट जटिलता पैदा करता है—इससे पहले कि आपको वास्तव में प्रदर्शन बढ़त की ज़रूरत हो।
डेटाबेस नॉर्मलाइज़ेशन का सार
सीधी भाषा में, डेटाबेस नॉर्मलाइज़ेशन डेटा पुनरावृत्ति हटाता है और स्थिरता सुनिश्चित करता है।
इसके साथ क्वेरी जटिलता और प्रदर्शन में समझौते आते हैं। कुंजी है अपने वर्कलोड के आधार पर सही स्तर चुनना। OLTP सिस्टम्स 3NF तक के पूर्ण नॉर्मलाइज़ेशन से लाभान्वित होते हैं, जबकि रीड-हैवी एप्लिकेशन अक्सर गति के लिए रणनीतिक डीनॉर्मलाइज़ेशन चाहते हैं।
आपको केवल एक दृष्टिकोण नहीं चुनना पड़ता। डेटा अखंडता के लिए अपने ट्रांज़ैक्शनल डेटाबेस को नॉर्मलाइज़्ड रखें, फिर रिपोर्टिंग के लिए डीनॉर्मलाइज़्ड व्यूज़ या अलग विश्लेषणात्मक डेटाबेस का उपयोग करें। यह हाइब्रिड रणनीति आपको विश्वसनीयता और प्रदर्शन—दोनों देती है, जहाँ उनकी सबसे अधिक आवश्यकता होती है।
उचित नॉर्मलाइज़ेशन से शुरुआत करें, फिर सैद्धांतिक चिंताओं के बजाय वास्तविक प्रदर्शन समस्याओं के आधार पर चयनात्मक रूप से डीनॉर्मलाइज़ करें।
यदि आप अपने डेटाबेस कौशल को बढ़ाना चाहते हैं, तो ये कोर्स अगला बेहतरीन कदम हैं:
FAQs
डेटाबेस प्रबंधन में नॉर्मलाइज़ेशन के मुख्य लाभ क्या हैं?
नॉर्मलाइज़ेशन डेटा पुनरावृत्ति को समाप्त करता है, जिससे स्टोरेज लागत कम होती है और आपके डेटाबेस में असंगतियाँ रुकती हैं। यह अपडेट्स को तेज़ और अधिक भरोसेमंद बनाता है क्योंकि आपको कई तालिकाओं में खोजने के बजाय केवल एक ही जगह जानकारी बदलनी होती है। नॉर्मलाइज़्ड डेटाबेस फॉरेन की कॉन्स्ट्रेंट्स के माध्यम से बेहतर डेटा अखंडता देते हैं, साफ़-सुथरे सुरक्षा नियंत्रण क्योंकि संवेदनशील डेटा विशिष्ट तालिकाओं में रहता है, और बेहतर स्केलेबिलिटी क्योंकि छोटे, फोकस्ड टेबल्स इंडेक्सेस और पार्टिशनिंग के साथ बेहतर प्रदर्शन करते हैं।
नॉर्मलाइज़ेशन डेटा अखंडता को कैसे बेहतर बनाता है?
नॉर्मलाइज़ेशन फॉरेन की कॉन्स्ट्रेंट्स और पुनरावृत्त डेटा को हटाकर डेटाबेस स्तर पर डेटा अखंडता लागू करता है। जब आप ऐसे ग्राहक को गलती से डिलीट नहीं कर सकते जिसके सक्रिय ऑर्डर हैं, या किसी वैध ग्राहक के बिना ऑर्डर इन्सर्ट नहीं कर सकते, तो आपका डेटाबेस अपने-आप रेफ़रेन्शियल इंटेग्रिटी बनाए रखता है। चूँकि हर जानकारी केवल एक ही जगह मौजूद है, आप एक ही डेटा के परस्पर-विरोधी संस्करणों को कई तालिकाओं में नहीं पा सकते—जो एप्लिकेशन लॉजिक तोड़ने वाली असंगतियों को रोकता है।
नॉर्मलाइज़ेशन की आम गलतियाँ क्या हैं?
ओवर-नॉर्मलाइज़ेशन अनावश्यक जटिलता पैदा करता है जब आप उस डेटा को अलग-अलग बाँटते हैं जो स्वाभाविक रूप से साथ रहना चाहिए—जैसे किसी के नाम को कई तालिकाओं में बाँटना। इससे सरल क्वेरीज़ के लिए भी अत्यधिक जॉइन्स की ज़रूरत पड़ती है और प्रदर्शन खराब होता है। एक और गलती है अपने वास्तविक एक्सेस पैटर्न पर विचार किए बिना नॉर्मलाइज़ करना—यदि आप आम क्वेरीज़ के लिए लगातार एक ही तालिकाएँ जोड़ रहे हैं, तो आपको रणनीतिक डीनॉर्मलाइज़ेशन की ज़रूरत हो सकती है। फॉरेन की कॉलम्स पर खराब इंडेक्सिंग भी नॉर्मलाइज़्ड डेटाबेस में प्रदर्शन मार देती है, और जॉइन्स को अपेक्षा से कहीं धीमा बना देती है।
डीनॉर्मलाइज़ेशन डेटाबेस प्रदर्शन को कैसे प्रभावित करता है?
डीनॉर्मलाइज़ेशन जॉइन्स हटाकर रीड प्रदर्शन बेहतर करता है—जिससे उच्च-ट्रैफ़िक एप्लिकेशंस में आम क्वेरीज़ 50ms से 5ms तक तेज़ हो सकती हैं। हालाँकि, यह लिखने के ऑपरेशंस को अधिक जटिल बना देता है क्योंकि अपडेट्स को एक ही डेटा की कई डीनॉर्मलाइज़्ड प्रतियों में स्थिरता बनाए रखनी होती है। इससे डेटा असंगतियों का जोखिम बढ़ता है और सब कुछ सिंक में रखने के लिए अधिक एप्लिकेशन लॉजिक चाहिए होता है। डीनॉर्मलाइज़ेशन स्टोरेज स्पेस भी बढ़ाता है क्योंकि आप डेटा को तालिकाओं में डुप्लीकेट करते हैं।
कब डेटाबेस को नॉर्मलाइज़ या डीनॉर्मलाइज़ करना चाहिए—सर्वोत्तम तौर-तरीके क्या हैं?
डेटा अखंडता सुनिश्चित करने के लिए थर्ड नॉर्मल फ़ॉर्म (3NF) तक सही नॉर्मलाइज़ेशन से शुरू करें, फिर सैद्धांतिक चिंताओं के बजाय वास्तविक प्रदर्शन समस्याओं के आधार पर चयनात्मक रूप से डीनॉर्मलाइज़ करें। अपनी वास्तविक क्वेरी पैटर्न मापें—यदि आप किसी डेटा को अपडेट करने की तुलना में 100 गुना अधिक पढ़ते हैं, तो उन विशिष्ट तालिकाओं के लिए डीनॉर्मलाइज़ेशन समझदारी हो सकती है। हाइब्रिड दृष्टिकोण अपनाएँ: लिखने के लिए अपने ट्रांज़ैक्शनल डेटाबेस को नॉर्मलाइज़्ड रखें, फिर रिपोर्टिंग के लिए डीनॉर्मलाइज़्ड व्यूज़ या अलग विश्लेषणात्मक डेटाबेस बनाएँ। बदलाव करने से पहले हमेशा प्रदर्शन प्रोफ़ाइल करें, क्योंकि उचित इंडेक्सिंग और क्वेरी अनुकूलन अक्सर स्कीमा बदले बिना ही कथित नॉर्मलाइज़ेशन समस्याएँ सुलझा देते हैं।

यदि आप असंगत, दोहराए हुए डेटा से हमेशा के लिए छुटकारा चाहते हैं, तो डेटाबेस नॉर्मलाइज़ेशन सही रास्ता है।
आप उस झुंझलाहट को जानते हैं जब एक तालिका में ग्राहक जानकारी अपडेट करते हैं और पाते हैं कि पुराना संस्करण पाँच अन्य तालिकाओं में फैला हुआ है। आपकी क्वेरीज़ परस्पर-विरोधी परिणाम देती हैं, आपकी रिपोर्टें इस पर निर्भर अलग-अलग संख्या दिखाती हैं कि किस तालिका से डेटा लिया गया है, और आप उन डेटा अखंडता समस्याओं को डिबग करने में घंटे बिता देते हैं जो होनी ही नहीं चाहिए थीं। जैसे-जैसे आपका डेटाबेस बढ़ता है, ये समस्याएँ बढ़ती जाती हैं।
डेटाबेस नॉर्मलाइज़ेशन इन समस्याओं को सिद्ध गणितीय सिद्धांतों के अनुसार डेटा व्यवस्थित करके समाप्त कर देता है। यह प्रक्रिया नॉर्मल फ़ॉर्म्स का उपयोग करती है ताकि हर जानकारी एक ही स्थान पर मौजूद हो—जिससे आपका डेटाबेस भरोसेमंद और कुशल बनता है।
मैं आपको संपूर्ण नॉर्मलाइज़ेशन प्रक्रिया दिखाऊँगा—बुनियादी अवधारणाओं से लेकर उन्नत नॉर्मल फ़ॉर्म्स तक—ऐसे हाथों-हाथ उदाहरणों के साथ जो बिखरे हुए डेटा को साफ़, अनुरक्षणीय डेटाबेस संरचनाओं में बदल देते हैं।
नॉर्मलाइज़ेशन महत्वपूर्ण क्यों है?
नॉर्मलाइज़ेशन ही वह चीज़ है जो आपके डेटाबेस को रखरखाव के डरावने सपने में बदलने से बचाती है। आइए देखें कि वास्तविक दुनिया के अनुप्रयोगों के लिए सही नॉर्मलाइज़ेशन क्यों मायने रखता है।
डेटा पुनरावृत्ति
पुनरावृत्ति डेटाबेस प्रदर्शन की मूक हत्यारी है। जब आप एक ही जानकारी को कई जगह सहेजते हैं, तो आप केवल स्टोरेज नहीं बर्बाद कर रहे—आप असंगतियों के लिए मंच तैयार कर रहे हैं जो आपकी एप्लिकेशन लॉजिक को तोड़ देती हैं।
नॉर्मलाइज़ेशन के बिना, किसी ग्राहक का पता अपडेट करना मतलब हर उस तालिका की खोज करना जो पता डेटा सहेजती है। यदि एक भी छूट गया, तो आपकी रिपोर्टें परस्पर-विरोधी जानकारी दिखाएँगी। आपके उपयोगकर्ता अलग-अलग स्क्रीन पर अलग पते देखेंगे। आपका एनालिटिक्स अविश्वसनीय हो जाएगा।
नॉर्मलाइज़ेशन इसे ठीक करता है यह सुनिश्चित करके कि हर डेटा केवल एक ही जगह रहता है। जब आप उस ग्राहक का पता अपडेट करते हैं, तो वह हर जगह अपने-आप बदल जाता है क्योंकि सब एक ही स्रोत को संदर्भित करते हैं।
डेटा अखंडता
सही नॉर्मलाइज़ेशन के साथ अखंडता अभेद्य हो जाती है। फॉरेन की कॉन्स्ट्रेंट्स अनाथ रिकॉर्ड्स को रोकते हैं। आप गलती से किसी ऐसे ग्राहक को नहीं हटा सकते जिसके सक्रिय ऑर्डर अभी भी हैं। आपका डेटाबेस व्यापार नियमों को डेटा स्तर पर लागू करता है, केवल एप्लिकेशन कोड में नहीं।
इसका मतलब कम बग्स, स्वच्छ कोड, और ऐसी एप्लिकेशन जो तब भी पूर्वानुमेय ढंग से काम करें जब कई सिस्टम एक ही डेटा तक पहुँचें।
डेटा ऐनोमलीज़
उचित नॉर्मलाइज़ेशन के साथ संशोधन संबंधी ऐनोमलीज़ गायब हो जाती हैं। ये तब होती हैं जब आप डेटा इन्सर्ट, अपडेट, या डिलीट करते हैं और असंगतियाँ पैदा करते हैं या जटिल वर्कअराउंड्स की आवश्यकता होती है।
इन्सर्ट ऐनोमलीज़ आपको केवल एक रिकॉर्ड बनाने के लिए डमी डेटा जोड़ने पर मजबूर करती हैं। अपडेट ऐनोमलीज़ आपको वही जानकारी कई पंक्तियों में बदलने की आवश्यकता होती है। डिलीट ऐनोमलीज़ एक रिकॉर्ड हटाते समय इच्छित से अधिक जानकारी हटा देती हैं।
नॉर्मलाइज़्ड डेटाबेस इन समस्याओं को डेटा को इस तरह व्यवस्थित करके समाप्त कर देते हैं कि हर तथ्य एक ही बार और केवल एक ही बार दिखाई दे।
प्रदर्शन और स्केलेबिलिटी
जब आपकी डेटाबेस संरचना साफ़-सुथरी होती है तो प्रदर्शन और स्केलेबिलिटी बेहतर होती है। नॉर्मलाइज़्ड तालिकाएँ आम तौर पर छोटी होती हैं, जिसका मतलब है तेज़ क्वेरीज़ और बेहतर कैश उपयोग। छोटे, फोकस्ड टेबल्स पर इंडेक्स अधिक प्रभावी ढंग से काम करते हैं।
आपका डेटाबेस क्षैतिज रूप से स्केल कर सकता है क्योंकि नॉर्मलाइज़्ड डेटा की स्पष्ट सीमाएँ होती हैं। आप जानकारी को शार्ड्स में डुप्लिकेट किए बिना तालिकाओं का तार्किक विभाजन कर सकते हैं।
सुरक्षा
नॉर्मलाइज़्ड डेटाबेस में सुरक्षा प्रबंधन आसान हो जाता है। आप भरोसे के साथ टेबल-लेवल एक्सेस नियंत्रित कर सकते हैं क्योंकि संवेदनशील डेटा विशिष्ट, स्पष्ट परिभाषित स्थानों में रहता है। अप्रत्याशित तालिकाओं में छिपे ग्राहक क्रेडिट कार्ड नंबरों की चिंता करने की ज़रूरत नहीं।
ऑडिट ट्रेल भी अधिक साफ़ होते हैं—आपको ठीक-ठीक पता होता है कि बदलाव कहाँ हुए और आप उन्हें ट्रैक कर सकते हैं, बिना अपने स्कीमा में बिखरे पुनरावृत्त डेटा की खाक छाने।
संक्षेप में, नॉर्मलाइज़ेशन अराजक डेटा को एक भरोसेमंद नींव में बदल देता है जो आपकी एप्लिकेशन के साथ बढ़ती है।
आइए आगे देखें कि नॉर्मलाइज़ेशन के लिए पूर्वापेक्षाएँ क्या हैं।
मुख्य अवधारणाएँ और पूर्वापेक्षाएँ
तालिकाएँ नॉर्मलाइज़ करने से पहले, आपको समझना होगा कि नॉर्मलाइज़ेशन को प्रभावी क्या बनाता है। आइए उन आवश्यक अवधारणाओं को कवर करें जो पूरी प्रक्रिया में आपके निर्णयों का मार्गदर्शन करेंगी।
डेटाबेस नॉर्मलाइज़ेशन में कीज़ को समझना
कीज़ रिलेशनल डेटाबेस डिज़ाइन की नींव हैं—वे रिकॉर्ड्स की पहचान करती हैं और तालिकाओं को आपस में जोड़ती हैं।
एक प्राइमरी की तालिका की हर पंक्ति की विशिष्ट पहचान करती है। दो पंक्तियों में एक जैसी प्राइमरी की वैल्यू नहीं हो सकती, और यह null नहीं हो सकती। इसे अपने डेटा के लिए सामाजिक सुरक्षा नंबर जैसा समझें—हर रिकॉर्ड को ठीक एक मिलता है, और कोई डुप्लीकेट नहीं होता।
यहाँ
customer_idप्राइमरी की है। हर ग्राहक को एक यूनिक ID मिलती है जिसका उपयोग आप अन्य तालिकाओं से उसी ग्राहक को संदर्भित करने के लिए करेंगे।किसी भी कॉलम (या कॉलमों के संयोजन) को जो प्राइमरी की के रूप में काम कर सकता है, कैंडिडेट की कहते हैं। आपकी
customersतालिका मेंcustomer_idऔरemailदोनों कैंडिडेट की हो सकते हैं, क्योंकि दोनों ग्राहक की विशिष्ट पहचान करते हैं। आप इनमें से एक को प्राइमरी की चुनते हैं, और बाकी कैंडिडेट की बने रहते हैं।फॉरेन कीज़ तालिकाओं के बीच संबंध बनाती हैं। वे दूसरी तालिका की प्राइमरी की को संदर्भित करती हैं और ऐसे कनेक्शन स्थापित करती हैं जो डेटा अखंडता बनाए रखते हैं।
ordersतालिका मेंcustomer_idएक फॉरेन की है। यहcustomersतालिका में मौजूद किसीcustomer_idसे मेल खाना चाहिए। यह अनाथ ऑर्डर को रोकता है और सुनिश्चित करता है कि हर ऑर्डर किसी वास्तविक ग्राहक से संबंधित हो।कीज़ व्यापार नियमों को डेटाबेस स्तर पर लागू करती हैं, जिससे आपका डेटा केवल एप्लिकेशन-स्तरीय वैलिडेशन की तुलना में अधिक भरोसेमंद बनता है।
फंक्शनल डिपेंडेंसीज़ की भूमिका
फंक्शनल डिपेंडेंसीज़ बताती हैं कि एक तालिका में कॉलम एक-दूसरे से कैसे संबंधित हैं। यही गणितीय आधार है जो नॉर्मलाइज़ेशन के निर्णयों को संचालित करता है।
एक फंक्शनल डिपेंडेंसी तब मौजूद होती है जब एक कॉलम का मान दूसरे कॉलम के मान को निर्धारित करता है। हम इसे
A → Bके रूप में लिखते हैं, जिसका अर्थ है "A B को निर्धारित करता है" या "B A पर निर्भर है"।एक
customersतालिका में,customer_id → emailहोता है क्योंकि हर ग्राहक ID ठीक एक ईमेल पते से मैप होती है। यदि आपको ग्राहक ID पता है, तो आप निश्चित रूप से ईमेल निर्धारित कर सकते हैं।छवि 1 - फंक्शनल डिपेंडेंसी उदाहरण
यहाँ
customer_id → emailऔरcustomer_id → nameहैं क्योंकि ग्राहक ID ईमेल और नाम दोनों को निर्धारित करती है।फंक्शनल डिपेंडेंसीज़ पुनरावृत्ति की समस्याएँ उजागर करती हैं।
यदि आपके पास ऐसी तालिका है जहाँ
order_id → customer_nameहै, लेकिन आप हर ऑर्डर पंक्ति में ग्राहक का नाम सहेज रहे हैं, तो आपके पास पुनरावृत्ति है। ग्राहक का नाम उनके ID पर निर्भर करता है, न कि ऑर्डर ID पर।डिपेंडेंसी प्रिज़र्वेशन का मतलब है कि आपकी नॉर्मलाइज़्ड तालिकाएँ मूल फंक्शनल डिपेंडेंसीज़ को बनाए रखती हैं। नॉर्मलाइज़ेशन के दौरान जब आप किसी तालिका को विभाजित करते हैं, तो आपको मूल तालिका के व्यापार नियम लागू करने की क्षमता नहीं खोनी चाहिए।
लॉसलैस डीकंपोज़िशन यह सुनिश्चित करता है कि आप नॉर्मलाइज़्ड तालिकाओं को जोड़कर मूल तालिका का पुनर्निर्माण कर सकते हैं। जब आप तालिकाएँ विभाजित करते हैं तो कोई जानकारी नहीं खोती—जॉइन्स बिल्कुल वही डेटा वापस लाते हैं जिससे आपने शुरुआत की थी।
ये अवधारणाएँ साथ काम करती हैं: फंक्शनल डिपेंडेंसीज़ बताती हैं कि क्या अलग करना आवश्यक है, जबकि डिपेंडेंसी प्रिज़र्वेशन और लॉसलैस डीकंपोज़िशन यह सुनिश्चित करते हैं कि प्रक्रिया में कुछ भी न टूटे।
इन संबंधों को समझकर आप समझदारी से नॉर्मलाइज़ेशन के निर्णय ले पाते हैं जो कार्यक्षमता खोए बिना आपके डेटाबेस को बेहतर बनाते हैं।
स्टेप-बाय-स्टेप नॉर्मलाइज़ेशन प्रक्रिया
अब आइए वास्तविक नॉर्मलाइज़ेशन प्रक्रिया से गुजरते हैं—गंदे डेटा से शुरू करके उसे चरण-दर-चरण बदलते हुए। हर नॉर्मल फ़ॉर्म पिछले पर आधारित होता है, इसलिए आप बिना नॉर्मलाइज़्ड डेटा से सीधे 3NF पर नहीं जा सकते।
फर्स्ट नॉर्मल फ़ॉर्म (1NF)
पहला नॉर्मल फ़ॉर्म दोहराए हुए समूहों को हटाता है और सुनिश्चित करता है कि हर कॉलम में एटॉमिक मान हों। इसके बारे में और जानें First Normal Form (1NF) इन-डेप्थ गाइड में।
एटॉमिक मानों का अर्थ है कि प्रत्येक सेल में केवल एक ही जानकारी हो—न कोई सूची, न कॉमा-सेपरेटेड वैल्यू, न ही एक फ़ील्ड में कई डेटा पॉइंट्स। यही वह नींव है जो बाकी सबकुछ संभव बनाती है।
1NF का उल्लंघन यहाँ होता है:
छवि 2 - 1NF का उल्लंघन करने वाली तालिका
productsऔरquantitiesकॉलम में कॉमा से अलग कई मान हैं। आप "सभी ऑर्डर जिनमें लैपटॉप हों" जैसी क्वेरी आसानी से नहीं चला सकते या स्ट्रिंग पार्सिंग के बिना कुल मात्रा नहीं निकाल सकते।इसे 1NF में बदलने के लिए, दोहराए हुए समूहों को अलग पंक्तियों में बाँटें:
छवि 3 - 1NF का पालन करने वाली तालिका
अब हर सेल में ठीक एक मान है। आप मानक SQL ऑपरेशंस से डेटा को क्वेरी, सॉर्ट और एग्रीगेट कर सकते हैं।
सेकंड नॉर्मल फ़ॉर्म (2NF)
दूसरा नॉर्मल फ़ॉर्म आंशिक निर्भरताएँ हटाता है—जब नॉन-की कॉलम, कॉम्पोज़िट प्राइमरी की के केवल एक हिस्से पर निर्भर होते हैं।
सेकंड नॉर्मल फ़ॉर्म (2NF) में दिखने से अधिक बातें हैं। इसके बारे में और जानें हमारे इन-डेप्थ गाइड में।
कोई तालिका 1NF में हो और हर नॉन-की कॉलम पूरी प्राइमरी की पर निर्भर हो, न कि उसके किसी हिस्से पर—तो वह 2NF में है।
हमारी 1NF तालिका में समस्या है। यदि हम
order_idऔरproductको कॉम्पोज़िट प्राइमरी की मानें, तोcustomer_nameकेवलorder_idपर निर्भर है, प्रोडक्ट पर नहीं। इससे पुनरावृत्ति बनती है—एक ऑर्डर में हर प्रोडक्ट के लिए ग्राहक का नाम दोहरता है।2NF पाने के लिए, निर्भरताओं के आधार पर तालिका को विभाजित करें:
अब
customer_nameप्रति ऑर्डर केवल एक बार आता है, और पुनरावृत्ति खत्म हो जाती है। हर तालिका में कॉलम पूरी प्राइमरी की पर निर्भर हैं।थर्ड नॉर्मल फ़ॉर्म (3NF)
तीसरा नॉर्मल फ़ॉर्म ट्रांज़िटिव डिपेंडेंसीज़ हटाता है, जो तब होती हैं जब नॉन-की कॉलम प्राइमरी की के बजाय अन्य नॉन-की कॉलम पर निर्भर होते हैं। Third Normal Form (3NF) में और गहराई से जाएँ।
ट्रांज़िटिव डिपेंडेंसी तब मौजूद होती है जब “कॉलम A” “कॉलम B” को निर्धारित करता है, और “कॉलम B” “कॉलम C” को—यानी A से C तक अप्रत्यक्ष निर्भरता बन जाती है।
आइए अपने ऑर्डर्स टेबल में ग्राहक का पता संबंधी जानकारी जोड़ते हैं:
समस्या यह है:
customer_name → customer_city, औरcustomer_city → customer_state। स्टेट सिटी पर निर्भर है, सीधे ऑर्डर पर नहीं। इससे पुनरावृत्ति बनती है—एक ही शहर के हर ऑर्डर में स्टेट जानकारी दोहरती है।3NF पाने के लिए, ट्रांज़िटिव डिपेंडेंसीज़ हटाकर अलग तालिकाएँ बनाएँ:
अब भौगोलिक जानकारी एक ही जगह रहती है। यदि कोई शहर स्टेट बदलता है (दुर्लभ पर संभव), तो आप हर उस शहर के ऑर्डर्स में खोजने के बजाय एक ही पंक्ति अपडेट करेंगे।
हर नॉर्मल फ़ॉर्म विशिष्ट पुनरावृत्ति समस्याएँ हल करता है, जबकि जॉइन्स के माध्यम से आपके मूल डेटा को पुनर्निर्मित करने की क्षमता बनाए रखता है।
एडवांस्ड नॉर्मल फ़ॉर्म्स
पहले तीन नॉर्मल फ़ॉर्म अधिकतर वास्तविक दुनिया की डेटाबेस समस्याएँ संभाल लेते हैं, लेकिन कुछ किनारी स्थितियों के लिए गहरे नॉर्मलाइज़ेशन की आवश्यकता होती है। ये उन्नत फ़ॉर्म उन विशिष्ट निर्भरता समस्याओं से निपटते हैं जिन्हें 3NF हल नहीं कर सकता।
बॉयस-कोड नॉर्मल फ़ॉर्म (BCNF)
BCNF उस सूक्ष्म समस्या को ठीक करता है जिसे 3NF छोड़ देता है: जब किसी तालिका में ओवरलैपिंग कैंडिडेट कीज़ होती हैं।
3NF नॉन-की कॉलम को कैंडिडेट कीज़ पर निर्भर होने देता है, लेकिन BCNF अधिक सख्त है। BCNF में हर डिटरमिनेंट (वह कॉलम जो किसी अन्य कॉलम को निर्धारित करता है) सुपरकी होना चाहिए—या तो प्राइमरी या कैंडिडेट की।
यहाँ 3NF विफल होता है:
व्यापार नियम हैं:
इससे
course → instructorऔरinstructor → courseनिर्भरताएँ बनती हैं।(student_id, course)और(student_id, instructor)दोनों कैंडिडेट की हैं, लेकिनcourseऔरinstructorबिना स्वयं सुपरकी हुए एक-दूसरे को निर्धारित करते हैं।समस्या तब दिखती है जब आप बिना छात्रों के नया प्रशिक्षक जोड़ना चाहते हैं। आप "प्रोफेसर स्मिथ डेटाबेस डिज़ाइन पढ़ाते हैं" तब तक इन्सर्ट नहीं कर सकते जब तक उस कोर्स में कोई छात्र न जोड़ें।
BCNF पाने के लिए, समस्याग्रस्त निर्भरता के आधार पर डीकंपोज़ करें:
अब आप बिना छात्रों के प्रशिक्षकों को जोड़ सकते हैं, और डेटाबेस संरचना व्यापार नियमों से पूरी तरह मेल खाती है।
फोर्थ नॉर्मल फ़ॉर्म (4NF)
4NF मल्टी-वैल्यूड डिपेंडेंसीज़ हटाता है—जब एक कॉलम, मानों के दूसरे स्वतंत्र सेटों को निर्धारित करता है।
मल्टी-वैल्यूड डिपेंडेंसी तब होती है जब “कॉलम A” “कॉलम B” में कई मान निर्धारित करता है, और ये मान तालिका के अन्य कॉलमों से स्वतंत्र होते हैं।
इस तालिका पर विचार करें जो छात्र के कौशल और शौक़ ट्रैक करती है:
छवि 4 - 4NF का उल्लंघन करने वाली तालिका
समस्या:
student_idकौशल और शौक़ दोनों को निर्धारित करता है, लेकिन कौशल और शौक़ एक-दूसरे से स्वतंत्र हैं। जब छात्र 1 नया कौशल सीखता है, तो आपको हर शौक़ संयोजन के लिए पंक्तियाँ बनानी होती हैं। जब वह नया शौक़ अपनाता है, तो हर कौशल संयोजन के लिए पंक्तियाँ चाहिए होती हैं।कौशल और शौक़ की संख्या बढ़ने पर यह विस्फोटक पुनरावृत्ति पैदा करता है।
4NF पाने के लिए, स्वतंत्र मल्टी-वैल्यूड डिपेंडेंसीज़ को अलग करें:
अब आप कौशल और शौक़ को स्वतंत्र रूप से जोड़ सकते हैं, बिना कार्टेशियन प्रोडक्ट विस्फोट बनाए।
फिफ्थ और सिक्स्थ नॉर्मल फ़ॉर्म (5NF और 6NF)
5NF (Project-Join Normal Form) जॉइन डिपेंडेंसीज़ को हटाता है: जटिल संबंध जो बिना सूचना हानि के डेटा को पुनर्निर्मित करने के लिए तीन या अधिक तालिकाओं की आवश्यकता रखते हैं।
जॉइन डिपेंडेंसी तब मौजूद होती है जब आप दो डीकंपोज़्ड तालिकाओं को जोड़कर मूल तालिका का पुनर्निर्माण नहीं कर सकते, लेकिन तीन या अधिक तालिकाओं को जोड़कर कर सकते हैं।
सप्लायर्स, पार्ट्स और प्रोजेक्ट्स पर यह नियम मानें: "कोई सप्लायर किसी प्रोजेक्ट को कोई पार्ट तभी सप्लाई कर सकता है जब वह सप्लायर वह पार्ट सप्लाई करता हो और उस प्रोजेक्ट पर काम भी करता हो।"
5NF पाने के लिए, इसे तीन बाइनरी संबंधों में डीकंपोज़ करें:
आप केवल तीनों तालिकाओं को जोड़कर वैध supplier-part-project संयोजनों का पुनर्निर्माण कर सकते हैं, जो स्कीमा स्तर पर व्यापार नियम लागू करता है।
6NF नॉर्मलाइज़ेशन को चरम तक ले जाता है—प्रत्येक एट्रिब्यूट को उसके अपने टेबल में समय-संबंधी कीज़ के साथ रखकर।
6NF डेटा वेयरहाउस और टेम्पोरल डेटाबेस के लिए बनाया गया है, जहाँ आपको हर एट्रिब्यूट में समय के साथ स्वतंत्र रूप से होने वाले बदलाव ट्रैक करने होते हैं।
यह आपको यह ट्रैक करने देता है कि प्रत्येक एट्रिब्यूट कब बदला, बिना अन्य को प्रभावित किए—लेकिन इससे क्वेरीज़ जटिल हो जाती हैं और यह आम तौर पर विशेष टेम्पोरल डेटाबेस सिस्टम्स के बाहर कम उपयोग होता है।
अधिकांश एप्लिकेशन 3NF या BCNF पर रुकते हैं। ये उन्नत फ़ॉर्म विशेष किनारी मामलों को हल करते हैं, लेकिन सामान्य व्यावसायिक अनुप्रयोगों के लिए इनकी जटिलता अक्सर सार्थक नहीं होती।