实体关系多个1:1

时间:2010-05-16 23:33:44

标签: ado.net frameworks entity ado.net-entity-data-model

我有一个应用程序,我有一个名为Hull的通用对象(表)。表中的每个船体都是独一无二的。

我有另一个有三个外壳的对象,但它们特别是Port_Hull,Center_Hull和Starboard_Hull。

我没有创建一对多的关系,而是试图为每一个建立一对一的关系,但这导致了许多错误,除非我从Hull到Vessel的关系从一个到多个(它不是) 。我知道如何解决这个问题,或者我应该放弃这个概念并让船只与一对多的船体关系并处理总是有三个条目的清单?

P.S。使用uniqueidentifiers可以在断开连接时添加记录。

船体表

  • HullID uniqueidentifier(主键)
  • 加上一堆船体数据字段

船只表

  • VesselID uniqueidentifier(主键)
  • MainHullID uniqueidentifier(尝试为密钥和非密钥)
  • PortHullID uniqueidentifier
  • StarboardHullID uniqueidentifier
  • 加上一堆船只数据字段

2 个答案:

答案 0 :(得分:0)

您在询问是否可以创建此内容或是否应该创建此内容?

首先,有可能:

Create Table Vessel
(
    VesselId uniqueidentifier not null primary key
    , MainHullId uniqueidentifier not null
    , PortHullId uniqueidentifier not null
    , StarboardHullId uniqueidentifier not null
    , ...
    , Constraint FK_Vessel_Hull_Main
        Foreign Key ( MainHullId )
        References Hull( HullId )
    , Constraint FK_Vessel_Hull_Port
        Foreign Key ( PortHullId )
        References Hull( HullId )
    , Constraint FK_Vessel_Hull_Startboard
        Foreign Key ( StarboardHullId )
        References Hull( HullId )
    , Constraint UC_Vessal_MainHullId Unique ( MainHullId )
    , Constraint UC_Vessal_PortHullId Unique ( PortHullId )
    , Constraint UC_Vessal_StarboardHullId Unique ( StarboardHullId )
)

如果您的子表具有父表的外键并且外键必须是唯一的,则会创建1:1关系。

现在,关于它是否是一个好的设计,这将取决于问题域。有一个基于左,右和中心的三个不同船体的vessal似乎很奇怪,但也许我错过了一些东西。

答案 1 :(得分:0)

您可以通过两种不同的方式解决这个问题:

  1. 为Vessel中的每个invidivual Hull字段添加唯一约束,即MainHull,PortHull,StarboardHull。这将确保船体只能由一艘船使用。
  2. 从容器中移除Hull字段,并向Hull - Vessel添加一个新字段。然后,这明确地命名该船体所属的船只。然后将HullType添加到Hull似乎也是有意义的,因此您知道它是什么类型的船体。对HullType + Vessel的唯一约束将确保每个容器最多获得每种类型的一个外壳(但不幸的是,可以具有给定类型的0)。
  3. 我会选择第一个。因为选择船只然后找到相关的船体似乎更自然,并且还确保每艘船都需要3个船体(在MainHull,PortHull,StarboardHull上确定非零约束。)

    编辑:看到你的评论,鉴于船只不需要3个船体,那么第二个解决方案也值得考虑。如果您需要添加其他类型的外壳,则可以在不更改架构的情况下执行此操作,因为外壳类型不是从引用的字段推断出来的,而是在建议的“HullType”字段中明确命名。