0

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

我有另一个具有三个船体的对象,但它们具体是 Port_Hull、Center_Hull 和 Starboard_Hull。

我没有创建一对多的关系,而是尝试为每个人创建一对一的关系,但这会导致许多错误,除非我将 Hull 与 Vessel 的关系设为一对多(事实并非如此)。知道我该怎么做,还是我应该放弃这个概念,让船与船的关系成为一对多的关系,并处理总是有三个条目的列表?

ps 使用uniqueidentifiers 尽可能多的用户可以在断开连接时添加记录。

船体表

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

容器表

  • VesselID 唯一标识符(主键)
  • MainHullID 唯一标识符(尝试作为键和非键)
  • PortHullID 唯一标识符
  • StarboardHullID 唯一标识符
  • 加上一堆 Vessel 数据字段
4

2 回答 2

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 关系。

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

于 2010-05-16T23:42:57.790 回答
0

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

  1. 为 Vessel 中的每个单独的 Hull 字段添加唯一约束,即 MainHull、PortHull、StarboardHull。这将确保船体只能由一艘船使用。
  2. 从容器中移除 Hull 字段,并在 Hull - Vessel 中添加一个新字段。然后明确命名该船体所属的船只。然后将 HullType 添加到 Hull 似乎也很有意义,因此您知道它是什么类型的 hull。HullType+Vessel 的唯一约束将确保每艘船最多获得每种类型的船体(但不幸的是,可以有 0 个给定类型。)

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

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

于 2010-05-16T23:56:05.267 回答