9

列が動的で、列データの数がいつでも増減できるデータがいくつかあります。そのため、列形式ではなく行単位で保存する予定です。

列のマスターテーブルが配置されており、列が使用しているデータ型を示しています。参考までに下のマスターテーブルを描いています

CID     Name          Type
1      Speed         Double
2      Input1        Bool
3      Message       String
.......
.......

今、私はこの動的列データを保存する2つの方法を考えました。最初の方法は

CID      Data_bool       Data_String      Data_Double
1        NULL            NULL             12
2        True            NULL             NULL
3        NULL            test             NULL
1        NULL            NULL             5
1        NULL            NULL             15

2番目の方法は、一般化されたvarchar列を1つ持ち、各値をそこに文字列として保存することでした。

CID      Datas
1        12
2        True
3        test
1        5
1        15

データベースの正規化の観点から見ると、2 番目の方法が適しているようです。しかし、データ検索で問題が発生する可能性があると思います。「速度> 10」のようにデータをフィルタリングしたいからです。したがって、2番目の方法(すべての値を文字列として保存する場合)に行くと、式の評価に時間がかかると思いますそして、式の最初の方法に行く場合、最初に式を評価する必要がある列を決定する必要があります. 元。式 Speed > 10 の場合、最初に Speed がどのデータ型 (string、bool など) であるかを確認してから、"data_double > 10" の式を再度実行する必要があります。

どちらにも独自の欠点があります。将来、どちらの方法で頭痛が軽減されるかを誰かが指摘できますか。このテーブルは、後の段階で数百万のレコードに成長することに注意してください。

ここでのあなたの見解と時間に感謝します。ありがとうございました。

4

4 に答える 4

1

1 つの方法として、関心のあるデータ型ごとに 1 つのテーブルを使用することが考えられます。これらのテーブルにはそれぞれ 2 つのフィールドしかありません。int 型の PK と、データを格納するための対応する型の列。マスター テーブルでは、特定の型のテーブルの 1 つにリンクする int 型の FK と、FK が属する子テーブルを決定する tinyint 型の別のフィールドを持つことができます。

マスターテーブル

ID int PK

ValueID int ヌルではない

tinyint と入力します。Null ではありません

子テーブル

ID int PK

値の文字列が Null でない

ValueID は、子テーブルからマスター テーブルへの FK です。他のタイプについても同様の子テーブルを作成できます。

于 2013-07-25T06:04:42.427 に答える
0

これは、これら 2 つのオプションのどちらが優れているかという質問の答えにはならないことは承知していますが、いずれにせよ役立つことを願っています。

私はこれら2つのオプションのいずれにも行きません。これらを列 (50 列または 100 列、さらにはそれ以上の列を持つテーブルを持つことは珍しくありません) および/または別のテーブルに収めることができるかどうかを確認したいと思います。

TFS または Dynamics CRM をインストールして、データの保存方法を確認することをお勧めします。データベースに列を追加/削除できるようにアプリケーションコードを構築し、このメタデータを追跡する一連のテーブルを持っています。

XML データ型で試すよりもはるかに異なる値が実際にある場合。

于 2013-07-25T11:27:27.620 に答える