SQL サーバーで整数または文字列のいずれかを含む列を定義する最良の方法は何ですか?

StackOverflow https://stackoverflow.com/questions/858323

  •  21-08-2019
  •  | 
  •  

質問

同じタイプの 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);

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

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

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

もっと良い方法があるはずです。誰でも?ありがとう。

役に立ちましたか?

解決

NEITHER列がEVER任意の数学的な操作に関与する場合、それらはCHAR()またはVARCHAR(作る)、あなたは文字ではなく、数字のシーケンスに対処されるように。 「1」は、「A」として、その場合には同じように有効です。

他のヒント

一言: やめてください

これは非常に悪い習慣です - 列には 単一のデータタイプ 理由があって。これを悪用してすべてをバリアントにしないでください。

マルク

私は、私は完全にあなたのケースを理解してわからないんだけど、似状況で私はint型のキーを格納するための文字列のキーと1を格納するTableAの、1に2つの列を作成しました。最終的に、彼らは(同じレコードではなく)空白可能両方の可能性があります。

1つの列を使用することによって、あなたはこのように不良データの可能性をintroducting外部キー関係を設定する機能を排除します。あなたは、彼らがdiffernt事を意味differntデータがあるとしてdifferntフィールドに格納された各テーブルのキーが必要です。 1つの列に保存することが非常に悪い考えでしょう。

さて、二つの問題があります。最初は、異なるタイプおよびこれらのタイプ(タイプBとタイプC)共通の親を持たないの両親を持つことができ、あなたのモデルタイプAで、オブジェクト指向設計です。明らかに、私はそれが本当の言葉でそうすることができると信じていない話します。しかし、私はこのケースでは、私はタイプAにTypeXを参照してくださいよ、あなたには、いくつかのTypeXからタイプBとタイプCを継承する場合、この問題が解決することができます...これらのタイプの意味を知りません。

2つ目は、DBの設計です。オブジェクト指向設計におけるエラーにあなたはDB側の問題を抱えています。ソリューションは同じである - タイプAとタイプBのために別々のテーブルを作成し、TypeXのための別のテーブルを作成し、そこにタイプAとタイプBの間のすべての共通の属性を置きます。 1と同様にタイプB:TypeXは1とタイプAに関連します。 この場合、タイプAの作成は、このように見えます - タイプAに行を挿入し、IDを取得し、TypeXに新しい行を挿入します。このソリューションでは、TypeXとタイプAまたはTypeXとタイプBの行に一致する必要があります。

TypeX(TypexID int型ではないnullで主キーのID(1,1)、SomeCommonColumn int型) タイプA(TypexID int型ではないnullで主キー、TypeASpecific int型) タイプB(TypexID int型ではないnullで主キー、TypeBSpecificのvarchar型)

これは、関係論クリアと非冗長な方法でこのような状況を実装するための唯一の方法です。それは非常に単純ではないように見えますが、通常はこれらのテーブルはとてもこれらのテーブルは、単一の(仮想)テーブルなどのアプリケーションで使用できるビューとストアドプロシージャによってカバーされます。

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top