Một cách tiếp cận khác là tạo một bảng kết hợp có chứa các cột cho từng loại tài nguyên tiềm năng. Trong ví dụ của bạn, mỗi loại trong số hai loại chủ sở hữu hiện tại có bảng riêng (có nghĩa là bạn có thứ gì đó để tham khảo). Nếu đây sẽ luôn là trường hợp bạn có thể có một cái gì đó như thế này:
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
)
Với giải pháp này, bạn sẽ tiếp tục thêm các cột mới khi bạn thêm các thực thể mới vào cơ sở dữ liệu và bạn sẽ xóa và tạo lại mẫu ràng buộc khóa ngoại được hiển thị bởi @Nathan Skerl. Giải pháp này rất giống với @Nathan Skerl nhưng trông khác biệt (tùy theo sở thích).
Nếu bạn sẽ không có Bảng mới cho mỗi loại Chủ sở hữu mới thì có lẽ nên bao gồm một chủ sở hữu_type thay vì một cột khóa ngoại cho mỗi Chủ sở hữu tiềm năng:
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
)
Với phương pháp trên, bạn có thể thêm bao nhiêu Chủ sở hữu tùy thích. Chủ sở hữu_ID sẽ không có ràng buộc khóa ngoại nhưng sẽ được sử dụng làm tham chiếu cho các bảng khác. Nhược điểm là bạn sẽ phải nhìn vào bảng để xem chủ sở hữu loại gì vì nó không rõ ràng ngay lập tức dựa trên lược đồ. Tôi sẽ chỉ đề xuất điều này nếu bạn không biết trước các loại chủ sở hữu và họ sẽ không liên kết với các bảng khác. Nếu bạn biết trước các loại chủ sở hữu, tôi sẽ đi với một giải pháp như @Nathan Skerl.
Xin lỗi nếu tôi có một số SQL sai, tôi đã ném nó cùng nhau.