Tôi đang phát triển cơ sở dữ liệu SQL Server 2012 và tôi có một câu hỏi về mối quan hệ Một-Không-Một-Một.
Tôi có hai bảng, Codes
và HelperCodes
. Một mã có thể có 0 hoặc một mã trợ giúp. Đây là tập lệnh sql để tạo hai bảng này và các mối quan hệ của chúng:
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])
)
Đúng không?
Mã và HelperCode đều là các thực thể khác nhau. HelperCode có thể là một mã được sử dụng (không có Mã nào tham chiếu nó) hoặc được sử dụng (chỉ một Mã tham chiếu nó).
Có lẽ Code.HelperCodeId phải là một phần của khóa chính của bảng Code. Nhưng tôi không chắc chắn nếu một cột null có thể là một phần của chính. Làm điều này, tôi muốn ngăn chặn hai hoặc nhiều Mã tham chiếu cùng một HelperCode.
HelperCodeId
cột là Unique.
HelperCodeId
trở thành một phần của PK? Có phải, trong bất kỳ trường hợp nào, bởi vì bạn muốn ngăn hai hoặc nhiều Mã để tham chiếu cùng một HelperCode?