0

ユーザーがエントリスキーマを作成できるデータ入力アプリケーションを作成しています。

これの私の最初のバージョンは、エントリスキーマごとに単一のテーブルを作成しました。各エントリは、適切なデータ型の単一または複数の列(複合型の場合)にまたがっています。これにより、「高速」クエリ(すべての列にインデックスを付けなかったため、小さなデータセットで)と、データ入力が複数のデータベースに分散された単純な同期が可能になりました。

しかし、私はこの解決策にあまり満足していません。唯一の良い点は単純さです...私は固定数の列しか格納できません。すべての列にインデックスを作成する必要があります。スキーマの変更時にテーブルを再作成する必要があります。

私の主要な設計基準のいくつかは次のとおりです。

  • 非常に高速なクエリ(単純なドメイン固有のクエリ言語を使用)
  • 書き込みは高速である必要はありません
  • 多くの同時ユーザー
  • スキーマは頻繁に変更されます
  • スキーマには数千の列が含まれる場合があります
  • データエントリは分散されている可能性があり、同期が必要です。
  • 望ましいMySQLとSQLite-DB2やOracleのようなデータベースは問題外です。
  • .Net/Monoの使用

私はいくつかの可能なデザインを考えてきましたが、どれも良い選択ではないようです。

解決策1:タイプ列とタイプごとに1つのNULL可能列を含むユニオンのようなテーブル。

これは結合を回避しますが、間違いなく多くのスペースを使用します。

解決策2:キー/値ストア。すべての値は文字列として保存され、必要に応じて変換されます。

また、多くのスペースを使用します。もちろん、すべてを文字列に変換する必要はありません。

解決策3:xmlデータベースを使用するか、値をxmlとして保存します。

経験がなければ、これは非常に遅いと思います(少なくとも、非常に優れたxpathサポートがない限り、リレーショナルモデルでは)。また、アプリケーションの他の部分がリレーショナルモデルとしてより適しているため、xmlデータベースを避けたいと思います。また、データを結合できると便利です。

誰かがすでにこれを解決したと思わずにはいられませんが、何も見つかりません。どちらを検索すればよいかよくわかりません...

市場調査が彼らのアンケートに対してこのようなことをしていることは知っていますが、オープンソースの実装はほとんどなく、私が見つけたものは法案に完全には適合していません。

PSPPには、私が考えているロジックの多くがあります。プリミティブ列タイプ、多くの列、多くの行、高速クエリとマージ。残念ながら、データベースに対しては機能しません。もちろん...提供されている機能の99%は必要ありませんが、多くのものは含まれていません。

これがそのようなデザイン関連の質問をするのに適切な場所かどうかはわかりませんが、ここの誰かがいくつかのヒントを持っているか、既存の仕事を知っているか、そのような質問をするためのより良い場所を教えてくれることを願っています。

前もって感謝します!

4

1 に答える 1

0

データ型ごとに 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 ステートメントを動的に構築する必要があります。

于 2010-05-29T10:46:59.603 に答える