Innym podejściem jest utworzenie tabeli asocjacji zawierającej kolumny dla każdego potencjalnego typu zasobu. W twoim przykładzie każdy z dwóch istniejących typów właścicieli ma własną tabelę (co oznacza, że masz coś do odniesienia). Jeśli tak będzie zawsze, możesz mieć coś takiego:
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
)
Dzięki temu rozwiązaniu można kontynuować dodawanie nowych kolumn podczas dodawania nowych jednostek do bazy danych, a także usuwać i odtwarzać wzorzec ograniczenia klucza obcego pokazany przez @Nathan Skerl. To rozwiązanie jest bardzo podobne do @Nathana Skerla, ale wygląda inaczej (w zależności od preferencji).
Jeśli nie zamierzasz mieć nowej tabeli dla każdego nowego typu właściciela, być może byłoby dobrze dołączyć kolumnę owner_type zamiast kolumny klucza obcego dla każdego potencjalnego właściciela:
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
)
Dzięki powyższej metodzie możesz dodać dowolną liczbę typów właścicieli. Owner_ID nie miałby ograniczenia klucza obcego, ale byłby używany jako odniesienie do innych tabel. Wadą jest to, że musiałbyś spojrzeć na tabelę, aby zobaczyć, jakie są typy właścicieli, ponieważ nie jest to od razu oczywiste na podstawie schematu. Sugerowałbym to tylko wtedy, gdy nie znasz wcześniej typów właścicieli i nie będą one łączyły się z innymi tabelami. Jeśli znasz wcześniej typy właściciela, wybrałbym rozwiązanie takie jak @Nathan Skerl.
Przepraszam, jeśli źle napisałem SQL, po prostu wrzuciłem to razem.