क्या इसे SQL सर्वर में एक टेबल पर कई अशक्त FKs रखने के लिए एक बुरा अभ्यास माना जाएगा


13

SQL सर्वर में मेरे डेटाबेस संरचना पर, मेरे पास 3 प्रकार के उत्पाद हैं जिन्हें ऑर्डर के बारे में अलग-अलग जानकारी की आवश्यकता होती है। तो, मैं एक बनाया Customers: मेज और तीन अलग-अलग आदेश टेबल OrdersForProductAs, OrdersForProductBs, OrdersForProductCs। सभी ऑर्डर टेबल में Customersटेबल पर कई संबंध हैं ।

मेरे पास एक और तालिका है जो Paymentsभुगतान विवरण को अंदर रखती है। लेकिन मुझे इसमें संदेह है कि इसे कैसे तैयार किया जाए।

जैसा कि मेरे पास कई उत्पाद प्रकार हैं और एक ग्राहक के पास एक ही समय में कई उत्पादों के लिए ऑर्डर हो सकते हैं, मुझे उन तीन ऑर्डर टेबल को Paymentsटेबल से संबंधित करना होगा ।

दूसरा मुद्दा यह है कि ग्राहक के पास केवल एक प्रकार के उत्पाद के लिए ऑर्डर हो सकता है। तो, Paymentsटेबल पर FK कॉलम होना चाहिए nullable

मेरा सवाल है कि क्या उन nullableएफके कॉलम लंबे समय तक मेरे लिए सिरदर्द बने रहेंगे या नहीं? आम तौर पर बोलना, क्या एक मेज पर अशांत FK कॉलम रखने को एक बुरा अभ्यास माना जाएगा?


2
सुनिश्चित करें कि आप एक चेक बाधा शामिल करते हैं ताकि कम से कम एक FKs शून्य न हो
डेमियन___बेलिवर २०'१२ को _

3
एक अशक्त विदेशी कुंजी एक बहुत अधिक है।
nvogel

जवाबों:


13

मैं पूछता हूं कि आपके पास OrdersForProductXटेबल क्यों है
यह संभव है कि आपके द्वारा पूछे गए एफके समस्या को डिजाइन किया जा सकता है ...

यदि इन तालिकाओं में समान संरचना है, तो आपको बस ProductTypeकिसी OrderProductतालिका पर एक कॉलम की आवश्यकता है । फिर Paymentबस एक एफके के साथ लिंक

यदि तालिका में अलग-अलग संरचनाएं हैं, तो मुझे लगता है कि उनके पास कुछ सामान्य विशेषताएं हैं। तो, आपके पास एक सामान्य OrderProductतालिका हो सकती है फिर प्रति उत्पाद प्रकार की विशिष्ट चाइल्ड टेबल (नीचे देखें) फिर से, Paymentएक एनके के साथ कॉमन टेबल के लिंक

यह "सुपरकी / उपप्रकार पैटर्न" है

  • UQ1 "सुपर की" है जो उपप्रकार तालिकाओं पर एक विदेशी कुंजी का उपयोग करती है
  • प्रत्येक उपप्रकार तालिका में एक समग्र PK और FK है (OrderID, ProductType)
  • प्रत्येक उप-प्रकार तालिका में उस तालिका के प्रकारों को प्रतिबंधित करने के लिए एक CHECK बाधा होती है

OrderProduct

  • ऑर्डरिड, पीके, यूक्यू 1
  • ProductType, UQ1
  • CommonThing1
  • ...

OrderProductA

  • ऑर्डरिड, पीके, एफके
  • ProductType, PK, FK, CHECK ProductType = A
  • ProductAThing1
  • ...

OrderProductB

  • ऑर्डरिड, पीके, एफके
  • ProductType, PK, FK, CHECK ProductType = B
  • ProductBThing1
  • ...

4
@tugberk: ध्यान दें कि आपके पास NULLइस दृष्टिकोण के साथ कोई FK कॉलम नहीं होगा ।
ypercube y

"यदि इन तालिकाओं में समान संरचना है" तो उनके पास समान संरचना नहीं है।
tugberk

5

अशक्त "विदेशी कुंजी" से बचें। उनके कई नुकसान हैं।

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

डेटाबेस डिज़ाइन टूल, इंटीग्रेशन टूल और अन्य सॉफ़्टवेयर हमेशा उनका सही ढंग से समर्थन नहीं करते हैं और उनके द्वारा उत्पादित परिणाम गलत हो सकते हैं।

विदेशी कुंजियों का उपयोग अक्सर जॉइन और अन्य क्वेरी लॉजिक में किया जाता है, उन उपयोगकर्ताओं के लिए समस्याओं को कंपाउंडिंग करता है जो सोचते हैं कि जब यह विशेष रूप से डीबीएमएस द्वारा लागू किए जा रहे लॉजिक को नहीं जानता है या नहीं जानता है तो यह प्रभाव में है।

जब कोई विदेशी कुंजी अशक्त हो, तो कुछ क्वेरी ऑप्टिमाइज़ेशन सुविधाएँ क्वेरी पुनर्लेखन और अन्य ऑप्टिमाइज़ेशन उपलब्ध नहीं हो सकती हैं।

तार्किक शब्दों में, एक अशक्त "विदेशी कुंजी" बाधा बहुत तार्किक अर्थ नहीं बनाती है। SQL मानक के अनुसार इस तरह की बाधा का उल्लंघन नहीं किया जा सकता है भले ही संदर्भित तालिका खाली हो। यह एक अशक्त का उपयोग करने के लिए सबसे आम कथित औचित्य में से एक का खंडन करता है - कि यह "अज्ञात" मामले का प्रतिनिधित्व करता है। यदि X के कोई मान्य मूल्य नहीं हैं, तो कोई भी "अज्ञात" X निश्चित रूप से एक वैध मूल्य नहीं हो सकता है - और फिर भी SQL इसे अनुमति देगा।

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


2

मैंने कभी नहीं सुना है कि यह अशक्त FK कॉलम का उपयोग करने के लिए बुरा व्यवहार माना जाता है। वे एक स्तंभ के लिए एक आदर्श फिट हैं जो एक और तालिका का संदर्भ देता है, लेकिन इसमें नहीं भरा जा सकता है (यानी यह वैकल्पिक डेटा है)।

(आपको क्यों लगता है कि यह एक समस्या होगी?)


धन्यवाद! वैसे, मुझे इस पर पूरा यकीन नहीं है, लेकिन मेरे पास कुछ साल पहले की तरह एक प्रोजेक्ट था और मुझे याद है कि मुझे किसी चीज को लेकर सिरदर्द हो रहा था । इसलिए, जैसा कि आप देख रहे हैं, मैं स्पष्ट नहीं हूं: ऐसा क्यों है क्योंकि मैंने सवाल पूछा है।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.