Sto sviluppando un database SQL Server 2012 e ho una domanda su una relazione One-to-Zero-Or-One.
Ho due tavoli Codes
e HelperCodes
. Un codice può avere zero o un codice helper. Questo è lo script sql per creare queste due tabelle e le loro relazioni:
CREATE TABLE [dbo].[Code]
(
[Id] NVARCHAR(20) NOT NULL,
[Level] TINYINT NOT NULL,
[CommissioningFlag] TINYINT NOT NULL,
[SentToRanger] BIT NOT NULL DEFAULT 0,
[LastChange] NVARCHAR(50) NOT NULL,
[UserName] NVARCHAR(50) NOT NULL,
[Source] NVARCHAR(50) NOT NULL,
[Reason] NVARCHAR(200) NULL,
[HelperCodeId] NVARCHAR(20) NULL,
CONSTRAINT [PK_Code] PRIMARY KEY CLUSTERED
(
[Id] ASC
),
CONSTRAINT [FK_Code_LevelConfiguration]
FOREIGN KEY ([Level])
REFERENCES [dbo].[LevelConfiguration] ([Level]),
CONSTRAINT [FK_Code_HelperCode]
FOREIGN KEY ([HelperCodeId])
REFERENCES [dbo].[HelperCode] ([HelperCodeId])
)
CREATE TABLE [dbo].[HelperCode]
(
[HelperCodeId] NVARCHAR(20) NOT NULL,
[Level] TINYINT NOT NULL,
[CommissioningFlag] TINYINT NOT NULL,
[LastChange] NVARCHAR(50) NOT NULL,
CONSTRAINT [PK_HelperCode] PRIMARY KEY CLUSTERED
(
[HelperCodeId] ASC
),
CONSTRAINT [FK_HelperCode_LevelConfiguration]
FOREIGN KEY ([Level])
REFERENCES [dbo].[LevelConfiguration] ([Level])
)
È corretto?
Un codice e un HelperCode sono entrambe entità diverse. Un HelperCode può essere un usato (nessuno Codice lo fa riferimento), o usato (solo un Codice lo fa riferimento).
Forse Code.HelperCodeId deve far parte della chiave primaria della tabella dei codici. Ma non sono sicuro che una colonna nulla possa far parte di una primaria. In questo modo, desidero impedire che due o più codici facciano riferimento allo stesso HelperCode.
HelperCodeId
colonna come Unica.
HelperCodeId
far parte del PK? È, per caso, perché vuoi impedire a due o più codici di fare riferimento allo stesso HelperCode?