যেহেতু আপনি বিদেশী কীগুলির জন্য অযোগ্য ক্ষেত্রগুলি ব্যবহার করছেন, আপনি বাস্তবে এমন কোনও সিস্টেম তৈরি করতে পারেন যা আপনি কল্পনা করার উপায়ে সঠিকভাবে কাজ করে। অ্যাকাউন্ট সারণিতে সারি সন্নিবেশ করানোর জন্য আপনার যোগাযোগ সারণিতে একটি সারি উপস্থিত থাকা প্রয়োজন যতক্ষণ না আপনি শূন্য প্রাইমারি কনট্যাক্টআইডি দিয়ে অ্যাকাউন্টগুলিতে সন্নিবেশকে অনুমতি না দিন। ইতিমধ্যে কোনও অ্যাকাউন্ট সারি উপস্থিত না করেই একটি পরিচিতি সারি তৈরি করতে, আপনাকে অবশ্যই যোগাযোগের টেবিলের অ্যাকাউন্টআইডি কলামটি বাতিল করতে দেবে। এটি অ্যাকাউন্টগুলিকে কোনও পরিচিতি না রাখার অনুমতি দেয় এবং পরিচিতিদের কোনও অ্যাকাউন্ট না থাকার অনুমতি দেয়। সম্ভবত এটি কাম্য, সম্ভবত না।
এটি বলার পরে, আমার ব্যক্তিগত পছন্দটি নীচের সেটআপ করা হবে:
CREATE TABLE dbo.Accounts
(
AccountID INT NOT NULL
CONSTRAINT PK_Accounts
PRIMARY KEY CLUSTERED
IDENTITY(1,1)
, AccountName VARCHAR(255)
);
CREATE TABLE dbo.Contacts
(
ContactID INT NOT NULL
CONSTRAINT PK_Contacts
PRIMARY KEY CLUSTERED
IDENTITY(1,1)
, ContactName VARCHAR(255)
);
CREATE TABLE dbo.AccountsContactsXRef
(
AccountsContactsXRefID INT NOT NULL
CONSTRAINT PK_AccountsContactsXRef
PRIMARY KEY CLUSTERED
IDENTITY(1,1)
, AccountID INT NOT NULL
CONSTRAINT FK_AccountsContactsXRef_AccountID
FOREIGN KEY REFERENCES dbo.Accounts(AccountID)
, ContactID INT NOT NULL
CONSTRAINT FK_AccountsContactsXRef_ContactID
FOREIGN KEY REFERENCES dbo.Contacts(ContactID)
, IsPrimary BIT NOT NULL
CONSTRAINT DF_AccountsContactsXRef
DEFAULT ((0))
, CONSTRAINT UQ_AccountsContactsXRef_AccountIDContactID
UNIQUE (AccountID, ContactID)
);
CREATE UNIQUE INDEX IX_AccountsContactsXRef_Primary
ON dbo.AccountsContactsXRef(AccountID, IsPrimary)
WHERE IsPrimary = 1;
এটি এর ক্ষমতা প্রদান করে:
- পিটার তার উত্তরে যেভাবে পরামর্শ দেয় তা ক্রস-রেফারেন্স টেবিলের মাধ্যমে স্পষ্টভাবে পরিচিতি এবং অ্যাকাউন্টগুলির মধ্যে সম্পর্ক চিত্রিত করুন
- একটি শব্দ, অ-বৃত্তাকার পদ্ধতিতে রেফারেন্সিয়াল অখণ্ডতা বজায় রাখুন।
- সূচকের মাধ্যমে প্রাথমিক যোগাযোগের একটি অত্যন্ত রক্ষণাবেক্ষণযোগ্য তালিকা সরবরাহ করুন
IX_AccountsContactsXRef_Primary
। এই সূচীতে একটি ফিল্টার রয়েছে, সুতরাং এটি কেবল প্ল্যাটফর্মগুলিতে কাজ করবে যা তাদের সমর্থন করে। যেহেতু এই সূচকটি UNIQUE
বিকল্পের সাথে নির্দিষ্ট করা হয়েছে , তাই প্রতিটি অ্যাকাউন্টের জন্য কেবলমাত্র একক প্রাথমিক যোগাযোগ থাকতে পারে।
উদাহরণস্বরূপ, আপনি যদি প্রতিটি অ্যাকাউন্টের তালিকার শীর্ষে প্রাথমিক পরিচিতিগুলি দেখিয়ে "প্রাথমিক" স্থিতিটি চিহ্নিত করে একটি কলাম সহ সমস্ত পরিচিতির একটি তালিকা প্রদর্শন করতে চান, আপনি এটি করতে পারেন:
SELECT A.AccountName
, C.ContactName
, XR.IsPrimary
FROM dbo.Accounts A
INNER JOIN dbo.AccountsContactsXRef XR ON A.AccountID = XR.AccountID
INNER JOIN dbo.Contacts C ON XR.ContactID = C.ContactID
ORDER BY A.AccountName
, XR.IsPrimary DESC
, C.ContactName;
ফিল্টারড সূচক একাউন্টে একক প্রাথমিক যোগাযোগের চেয়ে বেশি সন্নিবেশ রোধ করে, যখন একই সাথে প্রাথমিক পরিচিতির একটি তালিকা ফেরতের দ্রুত পদ্ধতি সরবরাহ করে। IsActive
অ্যাকাউন্টের সাথে পরিচিতিগুলির আর কোনও সম্পর্ক নেই তার পরেও, অ্যাকাউন্টের জন্য পরিচিতির ইতিহাস বজায় রাখতে একটি অনন্য-অনন্য ফিল্টারড সূচক সহ সহজেই অন্য কলামটি কল্পনা করা যায় :
ALTER TABLE dbo.AccountsContactsXRef
ADD IsActive BIT NOT NULL
CONSTRAINT DF_AccountsContactsXRef_IsActive
DEFAULT ((1));
CREATE INDEX IX_AccountsContactsXRef_IsActive
ON dbo.AccountsContactsXRef(IsActive)
WHERE IsActive = 1;