web-dev-qa-db-ja.com

キーと値のペアをデータベースに格納するより良い方法は?

データを保存する必要があるC#/ SQL Serverプログラムがあります。データには、Webサービスからの応答、データベースクエリの結果、その他のさまざまなものが含まれます。データが格納される前に、フィールドの数やデータ構造が何であるかを知る方法はありません。このために使用しているこの種の痛みを伴うテーブルがあります... 4つの列とたくさんの行。データの例は説明よりも簡単かもしれません。

InstanceID RowID PropertyName PropertyValue
1          1     Property1    Value1
1          1     Property2    Value2
1          1     Property3    Value3
1          2     Property1    Value1
1          2     Property2    Value2
1          2     Property3    Value3
2          1     OtherProp1   Value1
2          1     OtherProp2   Value2
2          2     OtherProp1   Value1
2          2     OtherProp2   Value2

これらの値はプルバックされ、更新可能なディクショナリオブジェクトにフィードされます。その後、フィールドがデータベースにフィードバックされます。これは、コードを作成するのが面倒な場合があります。また、非常に遅くなる可能性がある多くの挿入が必要です。

これを行うためのより良い方法を考えることはできませんが、私はそれがあるに違いないように感じます。何かアドバイス?

5
SuperNES

SQLはこのシナリオ用に設計されていませんが、ドキュメントおよびキーバリューストアは設計されています。それらの1つを使用することを検討しましたか?

たとえば、MongoDBには、LinqをサポートするC#ドライバーがあります(実際にそれが必要になるとは思いませんが)。 SQLエンティティごとに1つのmongodbドキュメントにすべての「動的データ」を格納するだけです。

別の代替方法はredisで、一意のエンティティ識別子を、対応するKey-Value-Dataを含むハッシュにマッピングするだけです。

4
back2dos

データに対してクエリを実行する必要がない場合は、XML形式の単一の列にすべてを格納できます。お気に入り

<properties>
    <property name="property1">Value1</property>
    <property name="property2">Value2</property>
</properties>

キーと値のペアに対してクエリを実行する必要がある場合は、いくつかのオプションがあります。 SQL Serverを使用している場合は、XML列がサポートされているため、クエリでXPathを使用できます。 XPathのインデックスを作成することもできます。他のデータベースエンジンにも同様の機能がある場合があります

また、コンテンツのインデックスを作成するElasticSearchなどの別の検索エンジンを使用することもできます。

3
palto

NoSQL(NosDB- オープンソース.Netデータベース )データベースを使用してオブジェクトをJSONに変換するか、NCacheを使用してC#オブジェクトをシリアル化し、そのまま保存することができます。

これらの個々の値に対してクエリを実行する必要がある場合は、SQL機能を使用するか、キーにタグを付けてグループ化する必要があります。NCacheは単なる.netキー値ストアではないためです。 ここをお読みください

store = NCache.InitializeCache("somecache");
DotNetObject dotNetObject = new DotNetObject();
store.Insert("key", DotNetObject);
// ... 
dotNetObject = store.get("key"); //voila you have the object deserialized
0
Basit Anwer

2番目のxmlソリューションです。また、LedgerSMBでは、拡張されたキーと値のペアに対してPostgreSQLでネイティブにサポートされているJSONを実行することを検討しているとも言えます。現在、これはSQL ServerでいくつかのTSQL処理関数を作成することで実行できることも指摘しておきます。 http://www.simple-talk.com/sql/t-sql-programming/sumption-json-strings-in-sql-server/ を参照してください

ただし、ネイティブではないJSONコンポーネントを使用する場合の複雑さを考えると、XMLを使用するのが次善策です。

0
Chris Travers

あなたは現在、リレーショナルデータベース内でこのニーズに対して従来のアプローチを取っています。

考慮すべき1つの変更は、値の厳密に型指定された列です。この投稿のオプション4と同様です https://stackoverflow.com/questions/112678

0
Dave Clausen

同様の方法でデータを使用/保存する多くのアプリケーションがあります。この例では「痛み」がどこから来ているのか正確にはわかりません。これは通常、従うべきかなり単純なモデルであるためです。

役立つかもしれない1つのことは、名前と値フィールドを持つSQLでカスタムテーブルデータ型を作成することです。次に、ストアドプロシージャを呼び出すと、InstanceID、RowID、xの名前と値のペアを含むカスタムタイプのテーブルなどを単に渡すことができます。

これにより、実際に渡されているものに関係なく、呼び出しのインターフェイスの一貫性が保たれます。

潜在的に見るべき何かがそれをキャッシュするためにクラスに静的オブジェクトを作成しているかもしれません。そのクラスのメソッドを介して管理し、必要に応じてSQLへの非同期呼び出しを提供して更新を維持します。

0
Underground