Làm cách nào để tôi mô hình mối quan hệ 0 hoặc 1 thành 0 hoặc 1 trong Sql Server theo cách tự nhiên nhất?
Có một bảng 'Nguy hiểm' liệt kê các mối nguy hiểm trên một trang web. Có một bảng 'Nhiệm vụ' cho công việc cần được thực hiện trên một trang web. Một số Nhiệm vụ là để khắc phục một mối nguy hiểm, không có nhiệm vụ nào có thể đối phó với nhiều mối nguy hiểm. Một số mối nguy hiểm có một nhiệm vụ để sửa chúng. Không có nguy hiểm có thể có hai nhiệm vụ liên quan đến chúng.
Dưới đây là cách tốt nhất tôi có thể nghĩ đến:
CREATE TABLE [dbo].[Hazard](
[HazardId] [int] IDENTITY(1,1) NOT NULL,
[TaskId] [int] NULL,
[Details] [varchar](max) NULL,
CONSTRAINT [PK_Hazard] PRIMARY KEY CLUSTERED
(
[HazardId] ASC
))
GO
ALTER TABLE [dbo].[Hazard] WITH CHECK ADD CONSTRAINT [FK_Hazard_Task] FOREIGN KEY([TaskId])
REFERENCES [dbo].[Task] ([TaskId])
GO
CREATE TABLE [dbo].[Task](
[TaskId] [int] IDENTITY(1,1) NOT NULL,
[HazardId] [int] NULL,
[Details] [varchar](max) NULL,
CONSTRAINT [PK_Task] PRIMARY KEY CLUSTERED
(
[TaskId] ASC
))
GO
ALTER TABLE [dbo].[Task] WITH CHECK ADD CONSTRAINT [FK_Task_Hazard] FOREIGN KEY([HazardId])
REFERENCES [dbo].[Hazard] ([HazardId])
GO
Bạn sẽ làm điều đó khác nhau? Lý do tôi không hài lòng với thiết lập này là vì cần phải có logic ứng dụng để đảm bảo rằng các nhiệm vụ và mối nguy hiểm chỉ đến nhau và không phải là nhiệm vụ và mối nguy hiểm khác và không có nhiệm vụ / nguy hiểm nào đối với cùng một nguy cơ / nhiệm vụ một nhiệm vụ / điểm nguy hiểm khác.
Có cách nào tốt hơn?
null
.
CREATE UNIQUE INDEX x ON dbo.Hazards(TaskID) WHERE TaskID IS NOT NULL;