2012-04-17 12 views
4

約20個のオプションフィールドがあるプロファイルページがあります。正規化したままにするには、20種類のテーブルを作成して、そこに20 JOINSというクエリを作成する必要があります。それは私の頭の上に少しあるようです。MYSQLと正規化:多くのオプションフィールドを扱う方法は?

これを実行する最善の方法はありますか?

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

+0

全員参加のビュー?? –

+0

'optional'フィールドは、値がnullになる可能性があることを意味します。なぜ、それが20の追加テーブルを意味するのかわかりません。 – Randy

+1

@Andyには、複数の正規化フォームがあることに注意してください。どれが目指しているかを判断し、パフォーマンス、ストレージスペース、保守性、適応性などの重要性を判断することが役立つかもしれません。それ以外の場合は、暗闇の中でただ撃っているだけです。 –

答えて

2

(何が起こっているかわからない限り少し混乱していますが)同じデザインのワードプレスを使用しています。これまではエンティティの属性値と呼ばれていました。@Matt Fenwickに感謝します。 https://stackoverflow.com/tags/eav/info

オッズとエンドを格納する20 INNER JOINテーブルの代わりに、2つのテーブルがあります。 1つはあなたのエンティティ(ワードプレスの場合はポスト)を格納し、2つ目はWPが参照するようにすべてのあなたのオッズとエンドまたはメタデータを格納します。 各データポイントの列を持つ代わりに、name、value、およびこのプロパティが適用されるエンティティの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によって指摘が)、これはあなたが各属性のデータ型を指定することができないことを意味使用して、日付属性は次のようになり、すなわち、ということですがbooleanまたはintと同様に、テキストとして格納されます。また、有効な値のテーブルにリンクするためにforiegnキーを使用することもできません(@Catcallのおかげで)。このルートを下る前に、これを慎重に検討する必要があります。

+1

http://stackoverflow.com/tags/eav/info –

+0

@jammypeachので、私はすべての値を1つの列に保持するコンマなどで区切られていますか? –

+1

@jammypeach:EAVをしない主な理由は、あなたが完全性の執行を失うことです。あなたの例のようにすべてが 'text'です。 –

0

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

データベースの正規化が重要な場合は、オプションフィールドが20個ある場合でも、重複したデータを格納しないように、それぞれのオプションフィールドに別々の 'ルックアップ'テーブルを用意する必要があります。

また、今後オプションを変更すると、将来的にテーブルを管理しやすくなります。

JOIN文はそれほど悪くはないので、MySQLは1つのクエリで最大61のテーブルをサポートできます。私はすでにthis question of mineのトピックを調べました。

+0

は理にかなっています(enumはjammypeachが言ったことと同じです)。私は1にそれをupvoteだろうが、私はすでにlolllからupvotedだろう –

+0

@AndyLobel LOL、タイ: – Ozzy

1

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

関連する問題