对于下面定义的站点表,我们有一个复合主键。从功能上讲,这完全符合我们的意愿。每个站点都应该有一个同区的父站点。以这种方式定义表专门允许这样做。
CREATE TABLE [dbo].[site](
[site_number] [nvarchar](50) NOT NULL,
[district_id] [bigint] NOT NULL,
[partner_site_number] [nvarchar](50) NULL,
CONSTRAINT [PK_site] PRIMARY KEY CLUSTERED
(
[site_number] ASC,
[district_id] ASC
)
ALTER TABLE [dbo].[site] WITH CHECK ADD CONSTRAINT [FK_site_site] FOREIGN KEY([partner_site_number], [district_id])
我的具体问题是关于在复合 PK 上定义的自引用 FK。我听说过一些关于这种特殊设计的意见,它们往往相互矛盾。有些人特别喜欢它,因为它在对复合键的一般理解范围内发挥应有的作用。其他人坚持认为它在理论上是不正确的,并且应该在 FK 中包含一个 [partner_district_id] 字段而不是 [district_id]。这种设计需要验证以强制执行 [district_id] = [partner_district_id],这可以通过检查约束或应用程序级逻辑来完成。
对这些解决方案或任何其他解决方案的进一步意见将不胜感激。