आपके पास कुछ विकल्प हैं, सभी "शुद्धता" और उपयोग में आसानी में भिन्न हैं। हमेशा की तरह, सही डिज़ाइन आपकी ज़रूरतों पर निर्भर करता है।
-
आप बस टिकट में दो कॉलम बना सकते हैं, OwnerdByUserId और OwnerdByGroupId, और प्रत्येक टेबल पर अशक्त विदेशी कुंजी रख सकते हैं।
-
आप टिकट:उपयोगकर्ता और टिकट:समूह संबंध दोनों को सक्षम करने के लिए एम:एम संदर्भ तालिका बना सकते हैं। शायद भविष्य में आप एक ही टिकट को एकाधिक उपयोगकर्ताओं या समूहों के स्वामित्व की अनुमति देना चाहेंगे? यह डिज़ाइन यह लागू नहीं करता है कि एक टिकट जरूरी केवल एक इकाई के स्वामित्व में हो।
-
आप प्रत्येक उपयोगकर्ता के लिए एक डिफ़ॉल्ट समूह बना सकते हैं और टिकट केवल एक सच्चे समूह या उपयोगकर्ता के डिफ़ॉल्ट समूह के स्वामित्व में हो सकते हैं।
-
या (मेरी पसंद) एक ऐसी इकाई को मॉडल करें जो उपयोगकर्ताओं और समूहों दोनों के लिए आधार के रूप में कार्य करती है, और उस इकाई के स्वामित्व वाले टिकट हैं।
आपके पोस्ट किए गए स्कीमा का उपयोग करके एक मोटा उदाहरण यहां दिया गया है:
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 primary key,
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 primary key,
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 primary key,
[Owner] int NOT NULL references dbo.Party(PartyId),
[Subject] varchar(50) NULL
)