Pendekatan lain adalah membuat tabel asosiasi yang berisi kolom untuk setiap jenis sumber daya potensial. Dalam contoh Anda, masing-masing dari dua tipe pemilik yang ada memiliki tabelnya sendiri (yang berarti Anda memiliki sesuatu untuk dirujuk). Jika ini akan selalu terjadi, Anda dapat memiliki sesuatu seperti ini:
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
)
Dengan solusi ini, Anda akan terus menambahkan kolom baru saat Anda menambahkan entitas baru ke database dan Anda akan menghapus serta membuat ulang pola batasan kunci asing yang ditunjukkan oleh @Nathan Skerl. Solusi ini sangat mirip dengan @Nathan Skerl tetapi terlihat berbeda (tergantung preferensi).
Jika Anda tidak akan memiliki Tabel baru untuk setiap jenis Pemilik baru, maka mungkin akan lebih baik untuk menyertakan tipe_milik daripada kolom kunci asing untuk setiap Pemilik potensial:
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
)
Dengan metode di atas, Anda dapat menambahkan Jenis Pemilik sebanyak yang Anda inginkan. Owner_ID tidak akan memiliki batasan kunci asing tetapi akan digunakan sebagai referensi ke tabel lain. Kelemahannya adalah Anda harus melihat tabel untuk melihat apa tipe pemiliknya karena tidak segera terlihat berdasarkan skema. Saya hanya akan menyarankan ini jika Anda tidak mengetahui jenis pemilik sebelumnya dan mereka tidak akan ditautkan ke tabel lain. Jika Anda mengetahui tipe pemilik sebelumnya, saya akan menggunakan solusi seperti @Nathan Skerl.
Maaf jika saya salah SQL, saya baru saja menyatukannya.