2016-07-08 8 views
1

セットが何であるかを明確にしていない場合は、ユーザーが値を挿入できるようにします。値がリストにあるかどうかをチェックし、交差を見つけます(値が2セットに存在する場合)。また、セットは値を1回だけ保持します。SQLでセットを使用するにはどうすればよいですか?

SQLでセットを使用するにはどうすればよいですか?私はsqliteを使用していますが、postgresqlに移動します。私にとって最も明白な選択肢は、SetID, SetValueというSetテーブルがあり、その2つの値がプライマリキーであるということでした。しかし、私はSetIDが何度も繰り返されるため、効率的ではないと感じています。もう1つの選択肢はテーブルint SetId, blob SetArrayですが、私は手で設定ロジックを実装する必要があります。

SQLでセットを行う最も良い方法は何ですか? sqliteまたはpostgresqlのいずれか?

+3

「SetID」と「SetValue」の2つの列を持つテーブルの最初のオプションは、私の意見でははるかに優れています。同じIDを何回も繰り返すオーバーヘッドは最小限であり、通常はブロブを分割するコストよりも大幅に低くなります。プライマリキーまたは少なくともユニークなインデックスは、値がセット内に1つしか存在できないことを保証します。次に、 'EXISTS'オペレータと' INTERSECT/EXCEPT'オペレータを使ってセットの重複と相違を特定し、この回答](@stackoverflow.com/q/3661766/1048425) – GarethD

+0

@ガレス:それは私が考えていたものです。あなたのコメントは答えになるはずです。私は良いものであるEXCEPT演算子について知らなかった –

+0

答えになるためにコメントに十分な内容があるとは確信していません。私は参照がない、またはある方法が別の方法よりも優れていることを証明するためのテストがあり、私の意見だけに基づいた回答は、他の場所からのより良い、実証された答えを妨げる可能性があります。 – GarethD

答えて

0

カップルのオプション:

  1. トリガー値を参照するには、存在し、それがない場合は、単にユニーク制約を使用して、エラー
を扱うNULL(あなたがやっている正確に何を達成し)
  • を返します

    これらは両方ともテーブルをバッグからセットに移動させますが、テーブルを異なる方法で選択します(わずかなパフォーマンスのコスト)、より一般的なSQLの方法で入力時にデータ検証を強制します。

    セットとして選択する場合は、代わりにselect distinctを使用してください。

  • 関連する問題