2010-05-16 155 views
0

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

我有另一个对象有三个外壳,但他们具体是Port_Hull,Center_Hull和Starboard_Hull。

与其创建一对多关系,我试图为每个关系创建一对一的关系,但这会导致很多错误,除非我将关系从Hull传递到Vessel一对多(它不是)。任何想法我是如何去做的,还是应该抛弃这个概念,让它成为一对多的关系,并处理总是有三个条目的列表?

p.s.使用uniqueidentifiers,因为许多用户可以在断开连接时添加记录。

赫尔表

  • HullID唯一标识符(主键)
  • 加上一束船体数据字段的

船只表

  • VesselID唯一标识符(主键)
  • MainHullID uniqueidentifier(试图为重点和非重点)
  • PortHullID唯一标识符
  • StarboardHullID唯一标识符
  • 加上一堆容器数据字段

回答

0

可以解决这个问题1:两个1不同的方式:

  1. 添加唯一约束在容器中的各invidivual赫尔领域,即MainHull,PortHull,StarboardHull。这将确保船只只能由一艘船只使用。
  2. 从船只中删除船体字段,并为船体添加一个新字段。然后明确命名该船体属于的船只。将HullType添加到Hull似乎也是有意义的,所以你知道它是什么类型的船体。对HullType + Vessel的唯一约束将确保每个船只最多只能获得一种类型的船体(但不幸的是,可能具有给定类型的0个)。

我会去第一个。因为选择一艘船然后找到相关的船体似乎更自然,并且还确保每艘船都具有所需的3个船体(在MainHull,PortHull,StarboardHull上分配非空限制)。

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

+0

问题与方法一(我认为),并不是每艘船都有三个船体(我简化了我原来的文章)。
有些船只是单体船,只有Mainhull,有些船只是双体船,有PortHull和StarboardHull。
我想知道是否对于船体表我应该使主键的VesselID字段加1个船体字符字段(M,P&S),使两个表之间的关系与一个外键索引VesselID,然后处理编码中的关系? – Evan 2010-05-17 00:04:35

+0

我会在船体上保留一个代理HullID - 你不想要复合PK - 在后面真正的痛苦。相反,在VesselID和M,P,S char字段上创建一个唯一的约束 - 我在我的答案中称为HullType。这样,你可以确保一艘船最多只有一个给定类型的船体。现在,对给定类型的船体进行天气测试对于给定容器是有意义的,这是另一个问题,您可以在代码中简单解析(可能在db模型中,但是很复杂)。您有一个复杂的域模型,您正在映射到数据库 - 你有没有考虑过使用对象关系映射工具,例如NHibernate的? – mdma 2010-05-17 00:20:40

+0

大声笑 - 我试图使用VisualStudio实体框架工具,如果它只是退出给我奇怪的错误和识别东西线枚举。 NHibernate为.net添加功能的标准框架? – Evan 2010-05-17 00:40:39

0

你问是否有可能创造这个还是你应该创建此的?

首先,它是可能的:当你有一个孩子表的外键父表和外键必须是唯一的创建1的关系:

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) 
) 

A 1。

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

+0

嗯,实际上,这两个问题。 但至于你的第二个问题。每个船体可以包含不同的部件(坦克,发动机等),实际上可以是不同的尺寸(也被捕获)。 IE浏览器。典型的三体船有一个更大的中心船体和两个较小的左舷和右舷船体。 我实际上已经简化了我的问题,因为我也有Vessels单体船和双体船有两个船体。我基于vesseltype字段为单体船,双体船和三体船创建不同的实体对象。这三种类型的方法假定不同的业务规则。 – Evan 2010-05-16 23:48:18