Ich entwickle eine SQL Server 2012-Datenbank und habe eine Frage zu einer Eins-zu-Null-Oder-Eins-Beziehung.
Ich habe zwei Tische Codesund HelperCodes. Ein Code kann null oder einen Hilfscode haben. Dies ist das SQL-Skript zum Erstellen dieser beiden Tabellen und ihrer Beziehungen:
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])
)
Ist das korrekt?
Ein Code und ein HelperCode sind unterschiedliche Entitäten. Ein HelperCode kann ein verwendeter (kein Code verweist darauf) oder ein verwendeter (nur ein Code verweist darauf) sein.
Möglicherweise muss Code.HelperCodeId Teil des Primärschlüssels der Codetabelle sein. Ich bin mir aber nicht sicher, ob eine Nullspalte Teil einer Primärspalte sein könnte. Auf diese Weise möchte ich verhindern, dass zwei oder mehr Codes auf denselben HelperCode verweisen.
HelperCodeIdSpalte als eindeutig festzulegen.
HelperCodeIdein Teil der PK sein wollen? Liegt es vielleicht daran, dass Sie verhindern möchten, dass zwei oder mehr Codes auf denselben HelperCode verweisen?