1

同じタイプの2つのオブジェクトに異なるタイプの親がある状況があります。次の擬似コードは、状況を最もよく説明しています。

TypeA a1, a2;
TypeB b;
TypeC c;
a1.Parent = b;
a2.Parent = c;

さらに複雑にするために、TypeBとTypeCには異なるタイプの主キーがある場合があります。たとえば、次のアサーションが当てはまる場合があります。

Assert(b.Id is string && c.Id is int);

私の質問は、SQLServerでこの親子関係を定義するための最良の方法は何ですか?私が考えることができる唯一の解決策は、TypeAテーブルにParentIdとParentTypeの2つの列があることを定義することです。

  • ParentIdはsql_variantです-数値と文字列の両方を保持できるようにするため
  • ParentTypeは文字列です-親タイプのアセンブリ修飾名を保持します。

ただし、sql_variantに基づいてユーザーデータ型を定義すると、フィールドサイズが固定8016バイトとして指定されました。これは、かなりの方法のようです。

より良い方法が必要です。誰?ありがとう。

4

5 に答える 5

12

一言:しないでください

これは非常に悪い習慣です-列には理由のために1つの単一のデータ型があります。これを悪用して、すべてをバリアントにしないでください.......

マーク

于 2009-05-13T14:36:09.390 に答える
1

NEITHER列が数学演算に関与することがない場合は、数値ではなく文字のシーケンスを処理するため、それらをCHAR()またはVARCHAR()にします。その場合、「1」は「A」と同じように有効です。

于 2009-05-13T14:39:51.520 に答える
1

あなたのケースを完全に理解したかどうかはわかりませんが、同様の状況で、TableAに2つの列を作成しました。1つは文字列キーを格納し、もう1つはintキーを格納します。最終的には、両方ともNULL可能になる可能性があります(ただし、同じレコードにはありません)。

于 2009-05-13T14:43:27.770 に答える
0

1つの列を使用することにより、外部キー関係を設定する機能を排除し、不正なデータの可能性をもたらします。各テーブルのキーは、異なることを意味する異なるデータであるため、異なるフィールドに格納する必要があります。それらを1つの列に格納することは非常に悪い考えです。

于 2009-05-13T14:53:56.193 に答える
0

さて、2つの問題があります。1つはオブジェクト指向デザインです。モデルでは、TypeAは異なるタイプの親を持つことができ、これらのタイプ(TypeBおよびTypeC)には共通の親がありません。はっきり言って、私はそれが本当の言葉でそうなることができるとは思わない。しかし、これらのタイプの意味はわかりません...この問題は、TypeXからTypeBとTypeCを継承する場合に解決できます。この場合、TypeAでTypeXを参照します。

2つ目はDB設計です。オブジェクト指向デザインのエラーにより、DB側で問題が発生します。解決策は同じです。TypeX用に個別のテーブルを作成し、TypeAとTypeBの間にすべての共通属性を配置し、TypeAとTypeB用に個別のテーブルを作成します。TypeXは、TypeBと同様に1:1としてTypeAに関連します。この場合、TypeAの作成は次のようになります。TypeXに新しい行を挿入し、IDを取得し、TypeAに行を挿入します。このソリューションでは、TypeXとTypeA、またはTypeXとTypeBに一致する行があります。

TypeX(TypexID int not null主キーID(1,1)、SomeCommonColumn int)TypeA(TypexID int not null主キー、TypeASpecific int)TypeB(TypexID int not null主キー、TypeBSpecific varchar)

それは関係理論でそのような状況を実行する唯一の方法です-明確で非冗長な方法。見た目はそれほど単純ではありませんが、通常、これらのテーブルはビューとストアドプロシージャでカバーされているため、アプリケーションで単一の(仮想)テーブルとして使用できます。

ありがとう、アレクサンダー

于 2009-05-13T15:42:39.420 に答える