दिलचस्प पोस्ट
जब मैं किसी निष्पादक सेवा पर समापन सेवा का उपयोग करूँ? तालिका सेल में लिंक बनाओ पूरी पंक्ति ऊंचाई भरें आप केवल एक एएलएफ अनुभाग की सामग्री कैसे निकाल सकते हैं MySQL JDBC ड्राइवर कनेक्शन स्ट्रिंग क्या है? देशी सी ++ में सी # जैसी संपत्तियां? AppCompat v22.1.0 के लिए उन्नत किया गया है और अब अवैध बेचा जा रहा है अपवाद: AppCompat वर्तमान थीम विशेषताओं का समर्थन नहीं करता है एंड्रॉइड जावा लाँग रनटाइमस्टेपशन कैमरे से कनेक्ट होने में विफल रहता है क्या कंप्यूटर द्वारा उपयोगकर्ता द्वारा प्रदत्त उदाहरणों के द्वारा एक नियमित अभिव्यक्ति "सीखना" संभव है? सफारी में क्रॉस-डोमेन कुकी सेट करना किसी ऑब्जेक्ट में एक JSON स्ट्रिंग को सुरक्षित रूप से बदलना कैसे प्राथमिक AppDomain से एक विधानसभा अनलोड? PHP फ़ंक्शन के साथ अपरिभाषित चर समस्या सफारी सत्र में एकाधिक पृष्ठों के साथ फेसबुक ऐफ़राइम ऐप चर निरंतर नहीं है किसी दृश्य संग्रह में संग्रह संग्रह को आप कैसे बाँध सकते हैं? क्या जेडीबीसी स्पेक को रोकता है? ऑपरेटर के रूप में इस्तेमाल किए जाने से (उद्धरणों के बाहर)?

एकाधिक तालिकाओं के लिए विदेशी कुंजी

मेरे डेटाबेस में मेरे पास 3 प्रासंगिक टेबल हैं

CREATE TABLE dbo.Group ( ID int NOT NULL, Name varchar(50) NOT NULL ) CREATE TABLE dbo.User ( ID int NOT NULL, Name varchar(50) NOT NULL ) CREATE TABLE dbo.Ticket ( ID int NOT NULL, Owner int NOT NULL, Subject varchar(50) NULL ) 

उपयोगकर्ता एकाधिक समूहों से संबंधित हैं यह बहुत से कई रिश्तों के माध्यम से किया जाता है, लेकिन इस मामले में अप्रासंगिक है। एक टिकट या तो एक समूह या उपयोगकर्ता के स्वामित्व में हो सकता है, dbo.Ticket.Owner फ़ील्ड के माध्यम से।

सबसे सही तरीके से टिकट और वैकल्पिक रूप से उपयोगकर्ता या समूह के बीच इस संबंध का क्या वर्णन होगा?

मैं सोच रहा हूं कि मुझे टिकट तालिका में एक ध्वज जोड़ना चाहिए जो कहता है कि यह किस प्रकार का मालिक है।

Solutions Collecting From Web of "एकाधिक तालिकाओं के लिए विदेशी कुंजी"

आपके पास कुछ विकल्प हैं, सभी "शुद्धता" में भिन्न हैं और उपयोग में आसानी हमेशा की तरह, सही डिजाइन आपकी आवश्यकताओं पर निर्भर करता है

  • आप टिकट, स्वामित्वधारी और स्वामित्व वाले समूह आईडी में केवल दो कॉलम बना सकते हैं, और प्रत्येक तालिका में रिक्त स्थान प्राप्त कर सकते हैं।

  • आप एम: एम संदर्भ तालिकाओं को टिकट बना सकते हैं, दोनों टिकट: उपयोगकर्ता और टिकट: समूह संबंध। शायद भविष्य में आप एक ही टिकट को एकाधिक प्रयोक्ता या समूह के स्वामित्व में रखने की अनुमति दे सकते हैं? यह डिज़ाइन यह लागू नहीं करता है कि एक टिकट केवल एक ही इकाई के स्वामित्व में होना चाहिए।

  • आप प्रत्येक उपयोगकर्ता के लिए एक डिफॉल्ट समूह बना सकते हैं और केवल एक सच्चे समूह या उपयोगकर्ता के मूलभूत समूह के स्वामित्व वाले टिकटों का प्रबंधन कर सकते हैं।

  • या (मेरी पसंद) एक इकाई मॉडल है जो उपयोगकर्ता और समूह दोनों के लिए आधार के रूप में कार्य करता है, और उस इकाई के टिकट मालिक हैं।

आपके पोस्ट स्कीमा का उपयोग करके किसी न किसी प्रकार का उदाहरण है:

 create table dbo.PartyType ( PartyTypeId tinyint primary key, PartyTypeName varchar(10) ) insert into dbo.PartyType values(1, 'User'), (2, 'Group'); create table dbo.Party ( PartyId int identity(1,1) primary key, PartyTypeid tinyint references dbo.PartyType(PartyTypeId), unique (PartyId, PartyTypeId) ) CREATE TABLE dbo.[Group] ( ID int NOT NULL, Name varchar(50) NOT NULL, PartyTypeId as cast(2 as tinyint) persisted, foreign key (ID, PartyTypeId) references Party(PartyId, PartyTypeID) ) CREATE TABLE dbo.[User] ( ID int NOT NULL, Name varchar(50) NOT NULL, PartyTypeId as cast(1 as tinyint) persisted, foreign key (ID, PartyTypeId) references Party(PartyID, PartyTypeID) ) CREATE TABLE dbo.Ticket ( ID int NOT NULL, [Owner] int NOT NULL references dbo.Party(PartyId), [Subject] varchar(50) NULL ) 

@ नाथन स्केर्ल की सूची में पहला विकल्प है जिसे मैंने एक परियोजना में एक बार लागू किया था, जहां तीन तालिकाओं के बीच एक समान संबंध स्थापित किया गया था। (इनमें से एक ने एक समय में दो अन्य संदर्भित किए।)

इसलिए संदर्भित तालिका में दो विदेशी कुंजी स्तंभ थे, और यह भी सुनिश्चित करने के लिए एक बाधा थी कि एक पंक्ति (एक न दोनों, न तो) को एक पंक्ति से संदर्भित किया गया था।

आपकी टेबल पर लागू होने पर यह कैसे दिख सकता है:

 CREATE TABLE dbo.[Group] ( ID int NOT NULL CONSTRAINT PK_Group PRIMARY KEY, Name varchar(50) NOT NULL ); CREATE TABLE dbo.[User] ( ID int NOT NULL CONSTRAINT PK_User PRIMARY KEY, Name varchar(50) NOT NULL ); CREATE TABLE dbo.Ticket ( ID int NOT NULL CONSTRAINT PK_Ticket PRIMARY KEY, OwnerGroup int NULL CONSTRAINT FK_Ticket_Group FOREIGN KEY REFERENCES dbo.[Group] (ID), OwnerUser int NULL CONSTRAINT FK_Ticket_User FOREIGN KEY REFERENCES dbo.[User] (ID), Subject varchar(50) NULL, CONSTRAINT CK_Ticket_GroupUser CHECK ( CASE WHEN OwnerGroup IS NULL THEN 0 ELSE 1 END + CASE WHEN OwnerUser IS NULL THEN 0 ELSE 1 END = 1 ) ); 

जैसा कि आप देख सकते हैं, Ticket तालिका में दो कॉलम, OwnerGroup और OwnerUser , जो दोनों ही निरर्थक विदेशी कुंजी हैं। (अन्य दो तालिकाओं में संबंधित कॉलम प्राथमिक कुंजी तदनुसार बनाए जाते हैं।) CK_Ticket_GroupUser चेक बाधा सुनिश्चित करता है कि केवल दो विदेशी कुंजी कॉलमों में से एक में एक संदर्भ होता है (दूसरा नल है, यही कारण है कि दोनों को नाकाम करना पड़ता है)।

(इस विशेष कार्यान्वयन के लिए Ticket.ID पर प्राथमिक कुंजी आवश्यक नहीं है, लेकिन निश्चित रूप से इस तरह से किसी तालिका में कोई नुकसान नहीं होगा।)

 CREATE TABLE dbo.OwnerType ( ID int NOT NULL, Name varchar(50) NULL ) insert into OwnerType (Name) values ('User'); insert into OwnerType (Name) values ('Group'); 

मुझे लगता है कि यह एक झंडा का उपयोग करने के बजाय आप क्या चाहते हैं, इसका प्रतिनिधित्व करने का सबसे सामान्य तरीका होगा