4

約 20 のオプション フィールドがあるプロファイル ページがあります。正規化を維持するには、20 個の異なるテーブルを作成してから、20 個のテーブルを使用してクエリを実行する必要がありますJOINS。それは私には少しやり過ぎに思えます。

それが最善の方法ですか?

正規化することをお勧めしますか?

4

3 に答える 3

2

これを行う良い方法は(何が起こっているのか分からない限り少し混乱しますが)WordPressが使用するのと同じデザインを使用することです - 私が覚えている限り、それはエンティティ属性値と呼ばれていました(@Matt Fenwickに感謝します)。https://stackoverflow.com/tags/eav/info

基本的な考え方は、INNER JOINオッズとエンドを格納する 20 個のテーブルの代わりに、2 つのテーブルを使用することです。1 つはエンティティ (wordpress の場合は投稿) を保存し、2 つ目はすべてのオッズとエンド、または WP が参照するメタデータを保存します。データ ポイントごとに 1 つの列を用意する代わりに、このプロパティが適用されるエンティティの名前、値、および ID 用の列を用意します。

このようにして、大量のSQL、拡張中の頭痛の種、および最初に構築するのに必要な時間を節約できます. 別のプロパティに対応する必要がある場合は、スキーマをハッキングする必要はありません。

WP のデータベース レイアウトの詳細 (ここでは主に wp_posts および wp_postmeta テーブルについて考えています): http://codex.wordpress.org/Database_Description

したがって、例は次のようになります(疑似コード、申し訳ありません):

table: yourEntity
entityID  int, primary key, auto increment
title     varchar

table: yourEntityMeta
entityID  int, non-unique key
name      text
value     text

NULLこのようにして、値を含む未使用の列と、結合が必要な 18 の追加テーブルに対する制限やパフォーマンスの問題なしに、エンティティごとに任意の数のプロパティを設定できます。

お役に立てれば

注: これに関する 1 つの問題 (コメントで @ypercube が指摘) は、これを使用すると、各属性のデータ型を指定できないことを意味します。また、外部キーを使用して有効な値のテーブルにリンクすることもできません (@Catcall のおかげです)。このルートを下る前に、これを慎重に検討する必要があります。

于 2012-04-17T14:41:48.363 に答える
1

オプションのフィールドにnull許容列を使用するだけです。テーブルは非常に大きくなりますが、非常に多くの結合はパフォーマンスを低下させるだけであり、このフィールドが 1 つのオブジェクトに属し、一緒に更新される場合、これらのフィールドを正規化する必要がある理由がわかりません。

于 2012-04-17T14:28:48.837 に答える
0

オプション フィールドが定数の場合は、ENUM (2 ~ 20 個のオプション) の使用を検討してください。ただし、この方法には落とし穴があります。

データベースの正規化が主な関心事である場合は、20 個のオプション フィールドがある場合でも、オプション フィールドごとに個別の「ルックアップ」テーブルを用意して、重複データを保存しないようにする必要があります。

また、将来オプションを変更することにした場合、将来的にテーブルを維持するのがずっと簡単になります。

JOIN ステートメントはそれほど悪くなく、MySQL は 1 つのクエリで最大 61 個のテーブルをサポートできます。このトピックについては、この私の質問ですでに調べました。

于 2012-04-17T14:28:39.273 に答える