0

Hullという汎用オブジェクト(テーブル)があるアプリケーションがあります。テーブル内の各船体は一意です。

3つの船体を持つ別のオブジェクトがありますが、具体的にはPort_Hull、Center_Hull、Starboard_Hullです。

1対多の関係を作成するのではなく、それぞれに1対1の関係を作成しようとしましたが、船体から船舶への関係を1対多にしない限り(そうではありません)、多くのエラーが発生します。私がこれをどのように行うか、または概念を放棄して、船と船体の関係を1対多にして、常に3つのエントリがあるリストを処理する必要がありますか?

ps一意の識別子を使用すると、切断中に多くのユーザーがレコードを追加できます。

ハルテーブル

  • HullID uniqueidentifier(主キー)
  • 加えて、船体データフィールドの束

ベッセルテーブル

  • VesselID uniqueidentifier(主キー)
  • MainHullID uniqueidentifier(キーおよび非キーとして試行)
  • PortHullIDのuniqueidentifier
  • StarboardHullIDのuniqueidentifier
  • 加えて、一連の船舶データフィールド
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の関係が作成されます。

さて、それが良い設計であるかどうかに関しては、それは問題の領域に依存します。左、右、中央に基づいて3つの異なる船体を持つ船体があるのは奇妙に思えますが、何かが足りないのかもしれません。

于 2010-05-16T23:42:57.790 に答える
0

この 1 対 1 の問題は、次の 2 つの方法で解決できます。

  1. Vessel の個々の Hull フィールド (MainHull、PortHull、StarboardHull) ごとに一意の制約を追加します。これにより、船体は 1 つの船でのみ使用できるようになります。
  2. 容器から Hull フィールドを削除し、新しいフィールドを Hull - Vessel に追加します。次に、この船体が属している船を明示的に指定します。HullType を Hull に追加することも理にかなっているように思われるので、それがどのタイプのハルかがわかります。HullType+Vessel の一意の制約により、各船が各タイプの船体を最大で 1 つ取得することが保証されます (ただし、残念ながら、特定のタイプの船体は 0 である可能性があります)。

私は最初のものに行きます。船を選択してから関連する船体を見つける方がより自然であるように思われるため、各船に必要な 3 つの船体があることを確認します (MainHull、PortHull、StarboardHull で非 null 制約を仮定します)。

編集:あなたのコメントを見て、船が3つの船体を必要としないことを考えると、2番目の解決策も検討する価値があります. ハルのタイプを追加する必要がある場合は、スキーマを変更せずにこれを行います。これは、ハルのタイプが参照されているフィールドから推測されるのではなく、提案された 'HullType' フィールドで明示的に名前が付けられているためです。

于 2010-05-16T23:56:05.267 に答える