3

Project というエンティティがあります。どのプロジェクトにもメンバーのグループが割り当てられています。すべてのメンバーから、年齢、身長などの情報を収集しています。数値型、テキスト型、論理型 (ブール値) などがあります。収集できる情報は数十種類あります。

これは、特定のプロジェクトで収集している情報であり、プロジェクト自体を定義します。1 つのプロジェクトで、3 ~ 5 個の情報を収集していました。一部のプロジェクトでは、同じまたは類似した一連の情報を収集できます。そして、私が興味を持っているのは、私が特定の情報を収集したすべてのプロジェクトの統計を作成することです.

問題は、これらの情報を含むテーブルのアーキテクチャはどうあるべきかということです。1 つの大きなテーブルに数十個の列があり、各行に多くの null 値があるというのは、データベースに何千、あるいは何百万もの値が存在することになるため、あまり良いとは言えません。しかし、すべてのプロジェクトから統計を作成するには、動的 SQL を使用する必要があるため、プロジェクトごとにテーブル (および同じ数のテーブル、同じ数のプロジェクト) を使用して、情報のみを収集するのも良くありません (変数テーブル名 - プロジェクトに応じて) を繰り返し、何百ものそれらを繰り返します。また、オプションごと、またはオプションタイプ(論理、テキスト、ブール)でさえテーブルを持つことは、それを行う適切な方法ではないようです。

PostgreSQL データベースを使用しています。一部のデータベースには ANYTYPE (Microsoft SQL Server の sql_variant、Oracle の ANYDATA など) のようなものがあることは知っていますが、PostgreSQL にはありません。

これにはもっと良い解決策があると確信していますが、それを理解することはできません。見つけるのを手伝ってくれませんか?

一つ一つの応答を前もって感謝します。

4

3 に答える 3

4

すでに定義でき、「定数」(およびすべてのメンバーに共通) であるすべてのプロパティをテーブルの実際の列に配置します。動的なものには、hstore データ型を使用できます。

http://www.postgresql.org/docs/current/static/hstore.html

Oracle の ANYDATA よりもはるかに優れています (より柔軟で高速です)。

于 2012-10-26T16:51:00.490 に答える
1

提供された情報で理解できることから、データはリレーショナルではありません。ここで NoSql オプションを確認する必要があると思います。

于 2012-10-26T16:26:04.730 に答える
1

テーブル階層でクエリを実行できる、postgresql に組み込まれたテーブル継承機能があります。

優れたチュートリアルについては、postgresql のドキュメントのあちこちを参照してください

これらは、1 つのテーブルから継承するテーブルを作成する方法を説明します。親テーブルのすべてのフィールドは自動的に子テーブルに含まれ、親テーブルで実行されるすべてのクエリは子テーブルで実行されます (反対のテーブルや兄弟テーブルでは実行されません)。特別なキーワード ALONE を使用してクエリ (または句) を単一のテーブルに制限するように修飾しない限り、結果は連結されます。制約はテーブルの境界を越えないため、制約には注意する必要があります。つまり、親テーブルに制約が設定されている場合、制約はそのテーブルのみに制限され、子テーブルまたは兄弟テーブルには、制約されたテーブルの行の重複が含まれる可能性があります。

于 2012-10-27T13:09:17.273 に答える