가장 자연스러운 방법으로 Sql Server에서 0 대 1 대 0 또는 1 관계를 어떻게 모델링합니까?
사이트의 위험을 나열하는 '위험'테이블이 있습니다. 사이트에서 수행해야하는 작업에 대한 '작업'테이블이 있습니다. 일부 작업은 위험을 해결하기위한 것이며 여러 작업을 처리 할 수있는 작업은 없습니다. 일부 위험 요소에는 해결해야 할 작업이 있습니다. 어떤 위험도 그들과 관련된 두 가지 작업을 가질 수 없습니다.
아래는 내가 생각할 수있는 최선입니다.
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
다르게 하시겠습니까? 이 설정에 만족하지 않는 이유는 작업과 위험이 서로를 가리키고 다른 작업과 위험을 가리 키지 않도록하는 작업과 위험이 동일한 위험 / 작업을 가리 키지 않도록하는 응용 프로그램 논리가 필요하기 때문입니다 다른 작업 / 위험이 지적합니다.
더 좋은 방법이 있습니까?
null
.
CREATE UNIQUE INDEX x ON dbo.Hazards(TaskID) WHERE TaskID IS NOT NULL;