एक अन्य दृष्टिकोण एक एसोसिएशन तालिका बनाना है जिसमें प्रत्येक संभावित संसाधन प्रकार के लिए कॉलम हैं। आपके उदाहरण में, दो मौजूदा स्वामी प्रकारों में से प्रत्येक की अपनी तालिका है (जिसका अर्थ है कि आपके पास संदर्भ के लिए कुछ है)। यदि यह हमेशा ऐसा रहेगा तो आपके पास कुछ ऐसा हो सकता है:
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_ID int NOT NULL,
Subject varchar(50) NULL
)
CREATE TABLE dbo.Owner
(
ID int NOT NULL,
User_ID int NULL,
Group_ID int NULL,
{{AdditionalEntity_ID}} int NOT NULL
)
इस समाधान के साथ, आप नए कॉलम जोड़ना जारी रखेंगे क्योंकि आप डेटाबेस में नई इकाइयाँ जोड़ते हैं और आप @Nathan Skerl द्वारा दिखाए गए विदेशी कुंजी अवरोध पैटर्न को हटा और पुनः बनाएंगे। यह समाधान @Nathan Skerl से काफी मिलता-जुलता है, लेकिन भिन्न (वरीयता के लिए) दिखता है।
यदि आपके पास प्रत्येक नए स्वामी प्रकार के लिए एक नई तालिका नहीं है, तो शायद प्रत्येक संभावित स्वामी के लिए एक विदेशी कुंजी कॉलम के बजाय एक मालिक_प्रकार शामिल करना अच्छा होगा:
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_ID int NOT NULL,
Owner_Type string NOT NULL, -- In our example, this would be "User" or "Group"
Subject varchar(50) NULL
)
उपरोक्त विधि से, आप जितने चाहें उतने मालिक प्रकार जोड़ सकते हैं। Owner_ID में एक विदेशी कुंजी बाधा नहीं होगी, लेकिन इसे अन्य तालिकाओं के संदर्भ के रूप में उपयोग किया जाएगा। नकारात्मक पक्ष यह है कि आपको यह देखने के लिए तालिका को देखना होगा कि मालिक के प्रकार क्या हैं क्योंकि यह स्कीमा के आधार पर तुरंत स्पष्ट नहीं है। मैं केवल यह सुझाव दूंगा कि यदि आप पहले से मालिक के प्रकार को नहीं जानते हैं और वे अन्य तालिकाओं से नहीं जुड़ेंगे। यदि आप पहले से मालिक प्रकार जानते हैं, तो मैं @Nanan Skerl जैसे समाधान के साथ जाऊंगा।
क्षमा करें, अगर मुझे कुछ SQL गलत मिला, तो मैंने इसे एक साथ फेंक दिया।