मैं बहुत बार डेटाबेस में एक स्थिति में आता हूं, जहां एक दी गई तालिका कई अलग-अलग मूल तालिकाओं में से एक को FK कर सकती है। मैंने समस्या के दो समाधान देखे हैं, लेकिन न तो व्यक्तिगत रूप से संतोषजनक है। मैं उत्सुक हूं कि आपने वहां क्या अन्य पैटर्न देखे हैं? इसे करने का कोई बेहतर तरीका है?
एक कंट्रास्टेड उदाहरण
आइए बताते हैं कि मेरा सिस्टम क्या है Alerts
। विभिन्न प्रकार की वस्तुओं के लिए अलर्ट प्राप्त किए जा सकते हैं - ग्राहक, समाचार और उत्पाद। एक दिया गया अलर्ट केवल एक आइटम के लिए हो सकता है। जिस भी कारण से ग्राहक, लेख और उत्पाद तेजी से आगे बढ़ रहे हैं (या स्थानीयकृत हैं) इसलिए अलर्ट के निर्माण पर आवश्यक पाठ / डेटा को अलर्ट में नहीं खींचा जा सकता है। इस सेटअप को देखते हुए मैंने दो समाधान देखे हैं।
नोट: नीचे DDL SQL सर्वर के लिए है, लेकिन मेरा प्रश्न किसी भी DBMS पर लागू होना चाहिए।
समाधान 1 - एकाधिक अशक्त FKeys
इस समाधान में एक-से-कई तालिकाओं को जोड़ने वाली तालिका में कई FK कॉलम हैं (संक्षिप्तता के लिए नीचे DDL FK निर्माण नहीं दिखाता है)। अच्छा - इस समाधान में यह अच्छा है कि मेरे पास विदेशी चाबियाँ हैं। एफके की अशक्तता इस सटीक डेटा को जोड़ने के लिए सुविधाजनक और अपेक्षाकृत आसान बनाती है। BAD Querying महान नहीं है क्योंकि इससे संबंधित डेटा प्राप्त करने के लिए N LEFT JOINS या N UNION स्टेटमेंट की आवश्यकता होती है । SQL सर्वर में, विशेष रूप से LEFT JOINS एक अनुक्रमित दृश्य बनाने में शामिल होते हैं।
CREATE TABLE Product (
ProductID int identity(1,1) not null,
CreateUTC datetime2(7) not null,
Name varchar(100) not null
CONSTRAINT PK_Product Primary Key CLUSTERED (ProductID)
)
CREATE TABLE Customer (
CustomerID int identity(1,1) not null,
CreateUTC datetime2(7) not null,
Name varchar(100) not null
CONSTRAINT PK_Customer Primary Key CLUSTERED (CustomerID)
)
CREATE TABLE News (
NewsID int identity(1,1) not null,
CreateUTC datetime2(7) not null,
Name varchar(100) not null
CONSTRAINT PK_News Primary Key CLUSTERED (NewsID)
)
CREATE TABLE Alert (
AlertID int identity(1,1) not null,
CreateUTC datetime2(7) not null,
ProductID int null,
NewsID int null,
CustomerID int null,
CONSTRAINT PK_Alert Primary Key CLUSTERED (AlertID)
)
ALTER TABLE Alert WITH CHECK ADD CONSTRAINT CK_OnlyOneFKAllowed
CHECK (
(ProductID is not null AND NewsID is null and CustomerID is null) OR
(ProductID is null AND NewsID is not null and CustomerID is null) OR
(ProductID is null AND NewsID is null and CustomerID is not null)
)
समाधान 2 - प्रत्येक पैरेंट टेबल में एक FK
इस समाधान में प्रत्येक 'पैरेंट' टेबल में अलर्ट टेबल के लिए FK है। माता-पिता से जुड़े अलर्ट को पुनः प्राप्त करना आसान बनाता है। नीचे की ओर, जो संदर्भ के लिए अलर्ट से कोई वास्तविक श्रृंखला नहीं है। इसके अलावा, डेटा मॉडल अनाथ अलर्ट के लिए अनुमति देता है - जहां कोई अलर्ट उत्पाद, समाचार या ग्राहक से संबद्ध नहीं है। फिर से, एसोसिएशन का पता लगाने के लिए कई बाएँ शामिल हैं।
CREATE TABLE Product (
ProductID int identity(1,1) not null,
CreateUTC datetime2(7) not null,
Name varchar(100) not null
AlertID int null,
CONSTRAINT PK_Product Primary Key CLUSTERED (ProductID)
)
CREATE TABLE Customer (
CustomerID int identity(1,1) not null,
CreateUTC datetime2(7) not null,
Name varchar(100) not null
AlertID int null,
CONSTRAINT PK_Customer Primary Key CLUSTERED (CustomerID)
)
CREATE TABLE News (
NewsID int identity(1,1) not null,
CreateUTC datetime2(7) not null,
Name varchar(100) not null
AlertID int null,
CONSTRAINT PK_News Primary Key CLUSTERED (NewsID)
)
CREATE TABLE Alert (
AlertID int identity(1,1) not null,
CreateUTC datetime2(7) not null,
CONSTRAINT PK_Alert Primary Key CLUSTERED (AlertID)
)
क्या यह केवल एक रिलेशनशिप डेटाबेस में जीवन है? क्या आपके वैकल्पिक समाधान हैं जो आपको अधिक संतोषजनक लगे हैं?
Alertable
। इसका कोई मतलब है?