動的なデータエントリバリューストア
-
05-10-2019 - |
質問
ユーザーがエントリスキーマを作成できるようにするデータエントリアプリケーションを作成しています。
私の最初のバージョンは、各エントリが適切なデータ型を持つ単一または複数の列(複雑なタイプの場合)にまたがるエントリスキーマごとに単一のテーブルを作成しました。これにより、「すべての列のインデックスを付けなかったため、小さなデータセットで」と「高速」クエリと、データエントリーがいくつかのデータベースで配布された単純な同期が可能になりました。
私はこの解決策にあまり満足していません。唯一の前向きなことは、シンプルさです...私は固定数の列のみを保存することができます。すべての列にインデックスを作成する必要があります。スキーマの変更に関するテーブルを再作成する必要があります。
私の重要な設計基準のいくつかは次のとおりです。
- 非常に高速クエリ(単純なドメイン固有のクエリ言語を使用)
- 書き込みは速い必要はありません
- 多くの同時ユーザー
- スキーマは頻繁に変わります
- スキーマには多くの列が含まれている場合があります
- データエントリは分布している可能性があり、同期が必要です。
- 好ましいMySQLおよびSQLite-DB2やOracleなどのデータベースは問題外です。
- .net/monoを使用します
私はいくつかの可能なデザインを考えてきましたが、それらのどれも良い選択のようには見えません。
ソリューション1:タイプ列を含むユニオンのようなテーブルとタイプごとに1つのnullable列。
これにより、結合は回避されますが、間違いなく多くのスペースを使用します。
ソリューション2:キー/バリューストア。すべての値は文字列として保存され、必要に応じて変換されます。
また、多くのスペースを使用しています。もちろん、私はすべてを文字列に変換する必要があります。
ソリューション3:XMLデータベースを使用するか、値をXMLとして保存します。
経験がなければ、これは非常に遅いと思います(少なくとも、非常に優れたXpathサポートがない限り)。また、アプリケーションの他の部分がリレーショナルモデルとしてより適しているため、XMLデータベースを避けたいと思います。データに参加できることは役立ちます。
誰かがすでにこれを解決していると考えるのを助けることはできませんが、私は何も見つけることができません。どちらも何を検索するのかよくわかりません...
私は市場調査が彼らのアンケートのためにこのようなことをしていることを知っていますが、オープンソースの実装はほとんどありません、そして私が見つけたものは法案に完全に適合していません。
pspp 私が考えている論理の多くがあります。プリミティブカラムタイプ、多くの列、多くの行、高速クエリ、マージ。残念なことに、データベースに対して動作しません。そしてもちろん...提供された機能の99%は必要ありませんが、多くのものは含まれていません。
これがそのようなデザインに関連する質問をするのに適した場所であるかどうかはわかりませんが、ここの誰かがいくつかのヒントを持っている、既存の仕事を知っている、またはそのような質問をするためのより良い場所を私に向けることができることを願っています。
前もって感謝します!
解決
すでに最も些細なソリューションを検討していますか。データ型のそれぞれに1つのテーブルを持ち、データベースにデータセットのスキーマを保存します。最も簡単な解決策:
DATASET Table (Virtual "table")
ID - primary key
Name - Name for the dataset/table
COLUMNSCHEMA Table (specifies the columns for one "dataset")
DATASETID - int (reference to Dataset-table)
COLID - smallint (unique # of the column)
Name - varchar
DataType - ("varchar", "int", whatever)
Row Table
DATASETID
ID - Unique id for the "row"
ColumnData Table (one for each datatype)
ROWID - int (reference to Row-table)
COLID - smallint
DATA - (varchar/int/whatever)
データセット(仮想テーブル)を照会するには、Columnschemaテーブルのスキーマ情報を使用してSQLステートメントを動的に構築する必要があります。