Ein anderer Ansatz besteht darin, eine Zuordnungstabelle zu erstellen, die Spalten für jeden potenziellen Ressourcentyp enthält. In Ihrem Beispiel hat jeder der beiden vorhandenen Eigentümertypen eine eigene Tabelle (was bedeutet, dass Sie auf etwas verweisen müssen). Wenn dies immer der Fall sein wird, können Sie so etwas haben:
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
)
Mit dieser Lösung würden Sie weiterhin neue Spalten hinzufügen, wenn Sie der Datenbank neue Entitäten hinzufügen, und Sie würden das von @Nathan Skerl angezeigte Fremdschlüsseleinschränkungsmuster löschen und neu erstellen. Diese Lösung ist @Nathan Skerl sehr ähnlich, sieht aber anders aus (je nach Präferenz).
Wenn Sie nicht für jeden neuen Besitzertyp eine neue Tabelle haben, ist es möglicherweise sinnvoll, für jeden potenziellen Eigentümer einen Eigentümertyp anstelle einer Fremdschlüsselspalte anzugeben:
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
)
Mit der obigen Methode können Sie so viele Besitzertypen hinzufügen, wie Sie möchten. Owner_ID hätte keine Fremdschlüsseleinschränkung, sondern würde als Referenz auf die anderen Tabellen verwendet. Der Nachteil ist, dass Sie in der Tabelle nachsehen müssen, welche Eigentümertypen es gibt, da dies anhand des Schemas nicht sofort ersichtlich ist. Ich würde dies nur vorschlagen, wenn Sie die Besitzertypen vorher nicht kennen und sie nicht mit anderen Tabellen verknüpft werden. Wenn Sie die Eigentümertypen im Voraus kennen, würde ich eine Lösung wie @Nathan Skerl wählen.
Tut mir leid, wenn ich etwas falsches SQL habe, habe ich das einfach zusammengeschmissen.