複数のタイプである可能性のある値を格納する最良の方法


10

より直接的かつ一般的な方法で質問を再質問したいと思います。

複数の異なるタイプの値を格納するテーブルをどのように作成しますか?

私の場合、値はイベントに関する診断を提供します。例:イベントが発生しました->イベントに関する関連情報を含む複数のPLCからの読み取り値を保存します。PLCは、あらゆるタイプのデータを監視できます。

私が考えることができるいくつかの例:

  • 可能なすべてのタイプの列を作成し、使用する列を示す別の列を作成します
    • 例:列:IntVal、StrVal、BoolVal、Type。値:null、null、True、「BOOL」
  • varcharとして値を保存します

回答:


9

EAVモデルへの道を迷っているという話をすでに聞いているようです。EAVモデルを事実上すべてのコストで回避する必要がある理由については、こちら画像をご覧ください。

上の画像の責任者であるビルカーウィンは、「SQLアンチパターン:データベースプログラミングの落とし穴を回避する」という本を書き、最初の章をEAVアンチパターンに当てています。彼はまた、大きなこのグループの打者とだ巨大な StackOverflowの上(データベースの問題のため)。

私のアドバイスは、結果のタイプごとにテーブルを用意VIEWし、必要に応じてsを使用してそれらを組み合わせることです。

例として、

CREATE TABLE char_result
(
  question_id INT,
  user_id INT,
  cresult CHAR,
  result_correct BOOLEAN (or equivalent in your RDBMS)
  ..
  <other stuff>
  ..
);

num_resultについても同じことを行いますが、cresultをnresult INT(FLOAT ...何でも)に置き換えます-VARCHAR&cについても同じ考えです。

次にVIEWresult_correct(および他のフィールドnumber_of_attempts-...&c。-他のフィールドが何であれ)の異なる結果テーブルにsを作成します。この場合、上記の陽気な画像のように人口を標高に追加することと同等の計算を実行していないのと同じように比較しています!


ビルへのカウンターとして、私はここにEAVの賛成で書いた:sqlblog.com/blogs/aaron_bertrand/archive/2009/11/19/...
アーロン・ベルトラン

同じ論理列に可能な型が複数あることはEAVを構成するとは思わない。彼は「バリアント/オブジェクト」タイプを探していると思います。これは、タイプごとに1つのテーブルを作成するよりも、いくつかの列を使用する方がはるかに簡単です。それは非常に不便に聞こえます。そして、ビューが作成された後は、そもそも同じテーブルに型を作成することと同じです。
usr

@usr私はあなたの解決策を見たいと思っています。
ジャレドビーチ

2
タイプごとに1列だけで十分です。私は過去にそのようにしたことがあります。それは最も悪い解決策です。これは別の引数です。可変型の列が2つある場合はどうでしょうか。この回答のソリューションでは、2次数のテーブルが必要です。これを基本テーブルとN * M個のテーブルに分割することもできます...これは正しくないようです。
usr

@usrは、これらの列がどれもできないというソリューションの1つの問題ではありませんNOT NULLか?個人的に、私は可能な限りいつでもNOT NULL制約があると信じています
Vérace

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.