3

格納されるエンティティには、25 以上のプロパティ (テーブルの列) があります。エンティティはかなり多様です。つまり、ほとんどの列は空です。平均して、20% 未満 (<5) のプロパティが特定のアイテムに価値を持っていると言えます。そのため、ほとんどのテーブル行に冗長な空の列がたくさんあります。ほぼすべての列が 10 進数です。

このシナリオを考えると、代わりに列をシリアル化することをお勧めしますか、それとも、可能なすべてのプロパティを含む「Property」という名前の別のテーブルを作成してから、外部キーを使用してプロパティをエンティティにマップするさらに別のテーブル「EntityProperty」を作成することをお勧めしますか? ? それともそのままにしておきますか?

この種の冗長性が発生するシナリオの例は次のとおりです。

私たちはたくさんの惑星がある架空の宇宙を持っています。私たちは宇宙採掘ゲームを作成しており、各惑星には 30 種類の鉱物が含まれています。ほとんどの惑星には 2 ~ 3 個の鉱物しかありません。

最も簡単な解決策は、鉱物ごとに 1 つずつ、30 の列を持つ単一のテーブル 'Planets' を作成することです。ここでの問題は、「Planets」テーブルのほとんどの行に 25 以上の列があり、それぞれの値が null またはゼロであることです。したがって、多くの冗長データがあります。たとえば、500k-1M のレコードがあるとします。nullまたはゼロの10進値を保存するには、最大で1バイトかかると思います。したがって、500,000〜1,000,000バイトのスペースを無駄にします。せいぜい1メガバイト。

もう 1 つの解決策は、2 つの追加のテーブルを作成することです。「Planets」テーブルにすべてのミネラルを格納する代わりに、それらをすべて取り出して、「Minerals」と呼ばれるミネラルのテーブルを作成します。これには、異なる鉱物の種類ごとに 1 つずつ、30 行のみが含まれます。次に、惑星の行と鉱物の行への参照を含む「PlanetMineral」というテーブルを作成します。さらに、このテーブルには、惑星が持つ鉱物の量を示す列があります。明らかに、多くのデータベース システムでは、複数の結合を実行する必要があるため、クエリが複雑になります。私はLINQ to SQLでSQLサーバーを使用しています。これは、コードからアクセスできるクラスオブジェクトプロパティに外部キー制約を足場にします。(つまり、planet.Minerals を使用して、惑星が持っているミネラルに簡単にアクセスできます) したがって、この観点からは、そうではありません。複雑さを加える必要はありません。冗長性は、最初のソリューションのごく一部 (1/15 など) です。まだいくらかのオーバーヘッドがある理由は、保存する必要がある外部キーのためです。

データ クエリの効率に関しては、クエリのコストがこれら 2 つのソリューション間でどのように比較されるかはわかりません。

4

2 に答える 2

0

数値については、個人的には 1 つの表にそのまま残します。数値は数バイトに圧縮され、EntityProperty テーブルを使用するためのオーバーヘッドはそれをはるかに上回ります。シリアル化はオプションですが、SQL を使用してプロパティを検索または計算することはできず、データを取得し、逆シリアル化してから計算する必要があります。

于 2010-04-17T09:44:21.547 に答える
0

場合によります:

  • 予定しているエンティティ (行) の数は?
  • そのテーブルに対して実行するクエリの種類は?
  • 今後、新しい物件が増える予定はありますか?
  • 物件をどのように活用する予定ですか?

シンプルなテーブルだとスペースの無駄遣いが気になりませんか?他のアプローチによるスペース節約が本当に重要で価値があるかどうかを計算してみてください。ディスクは(通常)安価です。

行数が少ない場合は、単一のテーブルの方がおそらく優れています (実装が簡単です)。

プロパティに対して複雑なクエリを作成する場合 (例: where property1 < 123) は、おそらく単純なテーブルの方が簡単です。

将来、多くの新しいプロパティを追加する予定がある場合は、Property/EntityProperties アプローチが役立つ可能性があります。


行数がかなり少ない (<1M) ため、単純な 1 つのテーブル アプローチを使用します。おそらくハンドヘルド/モバイルのもの (SQLServer) ではなく、サーバー マシンでデータベースを実行しており、データベース スキーマはかなり厳格です。 .

于 2010-04-17T09:57:47.880 に答える