Sql Serverでゼロまたは1対ゼロまたは1の関係を最も自然な方法でモデル化するにはどうすればよいですか?
サイトの危険をリストした「ハザード」テーブルがあります。サイトで実行する必要がある作業用の「タスク」テーブルがあります。一部のタスクはハザードを修正することであり、タスクは複数のハザードを処理することはできません。一部のハザードにはそれらを修正するタスクがあります。ハザードには2つのタスクを関連付けることができません。
以下は私が考えることができる最高のものです:
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;