Diğer bir yaklaşım, her potansiyel kaynak türü için sütunlar içeren bir ilişkilendirme tablosu oluşturmaktır. Örneğinizde, mevcut iki sahip türünün her birinin kendi tablosu vardır (bu, başvurmanız gereken bir şey olduğu anlamına gelir). Bu her zaman böyle olacaksa, böyle bir şeye sahip olabilirsiniz:
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
)
Bu çözümle, veritabanına yeni varlıklar eklerken yeni sütunlar eklemeye devam edeceksiniz ve @ Nathan Skerl tarafından gösterilen yabancı anahtar kısıtlama modelini silip yeniden oluşturacaksınız. Bu çözüm @Nathan Skerl'e çok benziyor ancak farklı görünüyor (tercihe göre).
Her yeni Sahip türü için yeni bir Tablonuz olmayacaksa, her bir potansiyel Sahip için yabancı anahtar sütunu yerine bir owner_type eklemeniz iyi olabilir:
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
)
Yukarıdaki yöntemle, istediğiniz kadar Sahip Türü ekleyebilirsiniz. Owner_ID, yabancı anahtar kısıtlamasına sahip olmayacak, ancak diğer tablolara referans olarak kullanılacaktır. Dezavantajı, şemaya göre hemen belli olmadığından, sahiplerin orada ne türlerinin olduğunu görmek için tabloya bakmanız gerekmesidir. Bunu yalnızca sahip türlerini önceden bilmiyorsanız ve diğer tablolarla bağlantı kurmayacaklarsa öneririm. Sahip tiplerini önceden biliyorsanız, @Nathan Skerl gibi bir çözüme başvururum.
Bazı SQL'i yanlış anladıysam özür dilerim, bunu birlikte attım.