1

对于下面定义的站点表,我们有一个复合主键。从功能上讲,这完全符合我们的意愿。每个站点都应该有一个同区的父站点。以这种方式定义表专门允许这样做。

    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],这可以通过检查约束或应用程序级逻辑来完成。

对这些解决方案或任何其他解决方案的进一步意见将不胜感激。

4

2 回答 2

2

我建议 SiteId 自己作为主键。DistrictId 可能应该是外键?

编辑 - 在这种情况下,我建议将额外的 PartnerDistrictId 添加到外键;您永远不会知道,您以后可能希望将一个站点与不同地区的另一个站点合作。但就我个人而言,我会支持这里的代理键。在大多数情况下;)

于 2009-08-26T14:44:44.503 回答
0

命名注释... Site_Id 本身不是唯一的吗?因为名称 Site_id 暗示 iut 是。如果它仅与 District_Id 组合是唯一的,那么它可能命名错误......如果它是 site_Sequence 或 District_site_No 或其他更清晰的东西,可能会更清楚。

If I understand your domain model, then all sites in a district 'derive' from the same root parent site, and there can be no overlap between sitres in different districts... if so then the same functionality could be achioeved by making DistrictID nullable, and only populate it for the root sites. Then the Site_Id could be a single field PK, and ParentSiteId could be a single Field FK. All 'child' sites would 'belong' to the district designated in their root parent Site record.

于 2009-08-26T14:47:13.250 回答