ฉันจะสร้างความสัมพันธ์แบบ zero-or-one ถึง zero-or-one ใน SQL Server เป็นวิธีที่เป็นธรรมชาติที่สุดได้อย่างไร
มีตาราง 'อันตราย' ที่แสดงอันตรายบนไซต์ มีตาราง 'งาน' สำหรับงานที่ต้องทำบนไซต์ งานบางอย่างเพื่อแก้ไขอันตรายไม่มีงานใดที่สามารถจัดการกับอันตรายหลายอย่างได้ อันตรายบางอย่างมีหน้าที่แก้ไข ไม่มีอันตรายใด ๆ ที่เกี่ยวข้องกับภารกิจทั้งสองได้
ด้านล่างเป็นสิ่งที่ดีที่สุดที่ฉันนึกได้:
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;