2012-12-24 15 views
5

मैं SQL सर्वर 2012एसक्यूएल सर्वर में सम्मिलित करना डेटा 2012

साथ काम कर रहा हूँ मैं दो टेबल, Person और Couple है, PersonCouple से एक विदेशी कुंजी है और Couple 'व्यक्ति' से विदेशी कुंजी है।

जब मैं प्रत्येक में डेटा डालने का प्रयास करता हूं, तो एक त्रुटि होती है क्योंकि प्रत्येक तालिका में अन्य तालिका से FK होता है, और दोनों प्रारंभ में खाली होते हैं।

CREATE TABLE [dbo].[Couple](
    [CoupleId] [int] IDENTITY(1,1) NOT NULL, 
    [HusbandPersonId] [int] NOT NULL, 
    [WifePersonId] [int] NOT NULL, 
    [StartDate] [date] NOT NULL, 
    [EndDate] [date] NOT NULL, 
CONSTRAINT [PK_Couple] PRIMARY KEY CLUSTERED 
(
    [CoupleId] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

CREATE TABLE [dbo].[Person](
    [PersonId] [int] IDENTITY(1,1) NOT NULL, 
    [ChildOfCoupleId] [int] NOT NULL, 
    [CityOfBirth] [int] NOT NULL, 
    [CityOfPermanentResidence] [int] NOT NULL, 
    [CityOfCurrentResidence] [int] NOT NULL, 
    [FirstName] [varchar](20) NOT NULL, 
    [LastName] [varchar](20) NOT NULL, 
    [BirthDate] [date] NOT NULL, 
    [DeathDate] [date] NOT NULL, 
    [IsMale] [bit] NOT NULL, 
CONSTRAINT [PK_Person] PRIMARY KEY CLUSTERED 
(
    [PersonId] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY 

ALTER TABLE [dbo].[Couple] WITH CHECK ADD CONSTRAINT [FK_Couple_Person] FOREIGN KEY([HusbandPersonId]) 
REFERENCES [dbo].[Person] ([PersonId]) 
GO 
ALTER TABLE [dbo].[Couple] CHECK CONSTRAINT [FK_Couple_Person] 
GO 
ALTER TABLE [dbo].[Couple] WITH CHECK ADD CONSTRAINT [FK_Couple_Person1] FOREIGN KEY([WifePersonId]) 
REFERENCES [dbo].[Person] ([PersonId]) 
GO 
ALTER TABLE [dbo].[Couple] CHECK CONSTRAINT [FK_Couple_Person1] 
GO 
ALTER TABLE [dbo].[Person] WITH CHECK ADD CONSTRAINT [FK_Person_Couple] FOREIGN KEY([ChildOfCoupleId]) 
REFERENCES [dbo].[Couple] ([CoupleId]) 
GO 
ALTER TABLE [dbo].[Person] CHECK CONSTRAINT [FK_Person_Couple] 
GO 

इसे कैसे हल करें?

+2

क्यों आपको वास्तव में दोनों टेबलों को एक-दूसरे को विदेशी कुंजी देने की ज़रूरत है? – Azzy

+4

बेहतर होगा कि आपने टेबल परिभाषाएं पोस्ट की हों। –

+0

कुछ डीबीएमएस आपको बाधाओं को * स्थगित * के रूप में परिभाषित करने की अनुमति देते हैं ताकि जब आप लेनदेन करते हैं तो उनका मूल्यांकन किया जाता है, न कि जब आप 'insert 'चलाते हैं। निश्चित नहीं है कि SQL सर्वर 2012 में ऐसी सुविधा है या नहीं। –

उत्तर

3

आपको यह आवश्यक नहीं है कि सभी लोगों के माता-पिता हों, क्योंकि आप माता-पिता-रिकर्सन के अनंत लूप को मार देंगे। यही है, आपके पास माता-पिता "एडम और ईव" जोड़े को सभी बच्चों के माता-पिता होने चाहिए।

अब, आप अपने ChildOfCoupleId कॉलम को एक समाधान के रूप में पूर्ण बना सकते हैं। लेकिन स्पष्ट रूप से मुझे लगता है कि CoupleId का उपयोग करना इष्टतम नहीं है। इसके बजाय, MotherId और FatherId का उपयोग करें। यह अंततः बेहतर है:

  1. आपको दोनों तत्वों को जानने की आवश्यकता नहीं है - यदि आप केवल एक माता-पिता को जानते हैं तो इसे दर्ज किया जा सकता है।

  2. बल्कि एक और तालिका जो व्यक्ति निर्धारित करने के लिए पूछे किया जाना चाहिए की तुलना में Person को Person बिंदु में FKS बनाकर FK संबंधों को सरल।

  3. एक निर्धारित प्रारंभ है और माता पिता के Couple की भागीदारी के लिए तारीख को रोकने के लिए आप के लिए मजबूर नहीं करता है - मैं तुम्हें इसके Marriage बुला नहीं कर रहे हैं, लेकिन आप Husband और Wife उपयोग कर रहे हैं पर ध्यान दें। तो यदि आप असली, टूटी हुई दुनिया को मॉडल करना चाहते हैं, तो यह जरूरी नहीं है कि वह जानकारी जान सके।

  4. जोड़े के साथ होने पर बिल्कुल बच्चे के माता-पिता को विचलित कर देता है। यदि कोई जोड़ा विवाह, तलाक और पुनर्विवाह करता है, तो आप निर्दिष्ट कर रहे हैं कि किस विवाह के बच्चे को गर्भ धारण किया गया था। सरल वंश के लिए यह अनावश्यक है - आपको केवल माता-पिता को जानने की जरूरत है। क्या होगा यदि विवाह रद्द हो गया है, लेकिन वे एक बच्चे को गर्भ धारण करने में कामयाब रहे? तब आप अभिभावक-बाल जानकारी कैसे स्टोर करेंगे? हमारे विश्व माता-पिता में जोड़े की स्थिति से एक अलग तथ्य है।

अंत में, अक्सर कॉलम से बचने के लिए सबसे अच्छा होता है। आप इस तरह के Parentage के रूप में एक नया टेबल बना कर सकते हैं:

CREATE TABLE dbo.Parentage (
    PersonID int NOT NULL 
     CONSTRAINT FK_Parentage_Person 
     FOREIGN KEY REFERENCES dbo.Person (PersonID), 
    ParentID int NOT NULL, 
    ParentIsMale bit NOT NULL, 
    CONSTRAINT PK_Parentage PRIMARY KEY CLUSTERED (PersonID, ParentIsMale), 
    CONSTRAINT FK_Parentage_Parent FOREIGN KEY (ParentID, ParentIsMale) 
     REFERENCES dbo.Person (ParentID, IsMale) 
); 

आपको यह करने के लिए एक FK बनाने के लिए Person तालिका में (ParentId, IsMale) पर एक अद्वितीय बाधा या अद्वितीय सूचकांक जोड़ना होगा। पीके/एफके के हिस्से के रूप में IsMale का उपयोग करना सुनिश्चित करता है कि आपको बिल्कुल एक मां और बिल्कुल एक पिता मिल जाए।

हालांकि यह डिज़ाइन घबराहट प्रतीत हो सकता है, लंबे समय तक यह वास्तविक लाभ प्रदान करेगा।एक व्यक्ति के पिता या मां का ज्ञान एक निरंतर कॉलम को अपडेट करने के बजाय पंक्ति के सम्मिलन के माध्यम से एन्कोड किया जाता है। यदि कोई पंक्ति नहीं है, तो माता-पिता अज्ञात है।

यह डिज़ाइन आसानी से विभिन्न प्रकार के माता-पिता को रिकॉर्ड करने के लिए अनुकूलित किया जाता है: अनुवांशिक, जन्म, गोद लेने वाला। एक व्यक्ति के पास 2 आनुवंशिक माता-पिता और जन्म मां हो सकती है। फिर विनाशकारी घटनाओं की एक श्रृंखला के माध्यम से सभी माता-पिता मारे गए और अपनाया जा सकता है (यहां तक ​​कि एक से अधिक बार)। तो आपको पीके को बदलने की आवश्यकता होगी, फिर ParentTypeID, FromDate, और ToDate तालिका में कॉलम जोड़ें। अनुचित संबंधों को इंगित करने से प्रतिबंधित करने के लिए और समायोजन आवश्यक होगा (जैसे कि "जन्म पिता")।

0

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

संबंधित मुद्दे