2016-06-26 15 views
0

別のテーブルと同じ構造のブールテーブルを作成してみたい。私はテーブルを作成する方法を知っていますが、私の問題は更新です。MS SQL Server、別のテーブルに基づいてテーブルを作成して更新する

私は、このテーブルを変更が可能ですしたい10等の高さ、などの人のための異なる属性を持つ列、走行速度、名前、髪の色など

とテーブルA1を考えてみましょうテーブルA1に列を削除または追加することで、これらの更新は他の列B1に適用されます。したがって、列は同じですがブール値(ブール値はA1に基づいていません)です。

私の最初の質問は、それが可能かどうかです。

私の2番目の理由は、更新が非常に効率的でないために200〜300件のレコードがあるとします。

(私はおそらく、テーブルを読み取り、手動で削除し、ADD/DROP SQL文を経由して列が追加されますが、私はよりダイナミック/ efficentソリューションがあった期待していた外部プログラムを作成することができます)

+0

私はあなたの例を完全に守っているわけではありませんが、行を更新することについて話しているのであれば、別のテーブルベースを更新することは非常に標準的な機能です。列の同期も簡単ですが、標準ではありません。これが自動的に起こるようにしたいのですか、別のアクションが起きたときに基づいていますか?巨大なフィールドでない限り、200-300レコードは、テーブルの変更が高速であるように効率を上げるほど重要ではありません。 – Matt

+0

表A1は、例えば、名前、身長、体重、髪の色。 テーブルB1には、名前、高さ、重さ、髪の色の列があります。 私は後で国籍のようにA1に列を追加します。B2に列の国籍を追加したいが、ブール型の値として – Sillyreduction

+0

を追加する場合ブール値はどうなりますか?これは自動的に必要ですか?あなたが変更の追跡をしようとしている場合は、 "あなたのためにそれを追跡するSQL Serverの変更の追跡"を調べることができます。また、列ではなく行で整理する有効なポイントがあります。 – Matt

答えて

0

にある場合は、あなたが望むものを示すために、列名とブール値を格納するための属性テーブルを使用することですEAVスキーマ "エンティティ属性値"です。これにより、物理的な表スキーマを変更することなく、新しい属性を動的に追加することができます。それはパフォーマンスにとっても恐ろしいことです(しかし、数百のエンティティだけではそれほど悪くはありません)。

もう一つの醜い解決策は、Attribute_1、Attribute_2などという名前のカラムを追加することです。次に、属性をその定義にマップできるルックアップテーブルがあります。

これはEAVスキーマよりも柔軟性がありませんが、特定の属性でインデックスを作成することで、クエリのパフォーマンスが向上します。

もう1つの解決策は、属性と値を保持するためにXMLデータ型を使用することです。 SQL ServerにはXMLデータ用の機能が組み込まれていますが、通常のSQLと同じように使いやすいわけではありませんが、かなりうまく機能します。

+0

EAVスキーマのパフォーマンスを列の追加と減算と比較すると、どのようになりますか? XMLではあまり働いていませんが、私はそれを使って何ができるかを見るために大まかなスケッチをします。 – Sillyreduction

0

よりもむしろ追加し、列をテーブルに引く。私はあなたが固定属性のテーブルを持っていることをお勧めします。次に、追加の属性(列の名前)を格納する別のテーブルを作成し、その人のIDを保持する3番目のテーブルを作成し、属性と属性の値を外します。例えば

ユーザテーブル:

UserId 
Firstname 
Surname 

属性テーブル

AttrId 
AttrName 

UserAttributeテーブル:あなたの質問に答えるために、このために

UserId 
AttrId 
AttrValue 

あなたは二組を持つことができますこれらのテーブルではなくAttrValueは2番目のテーブルのブール値になります。別の答えが掲載され

中間オプションは、テーブル内の複数のスペアの列のために行くと列が使用

+0

その背後にある論理だが、これは私の問題です。構造を読みにくく、列を削除したり追加したりするよりも速いかどうか分かりません。おそらくsomet親のテーブル機能から何らかの「子」を見つけることができない場合は類似しています。 – Sillyreduction

関連する問題