2010-12-16 3 views
4

私は30列以上のユーザーテーブルを持つプロジェクトで開発を引き継いだ。そして悪い点は、列の変更や追加が起こっていることです。データベーステーブルの列の数が多すぎますか?

これは正しくありません。

余分なフィールドを値として2番目のテーブルに移動し、それらのカラム名を格納する3番目のテーブルを作成する必要がありますか?

user 
    id 
    email 

user_field 
    id 
    name 

user_value 
    id 
    user_field_id 
    user_id 
    value 
+1

一言で言えば、NO! – HLGEM

答えて

9

Do はキー/値のルートになります。 SQLはそれを処理するようには設計されておらず、データベースから実際のデータを自己拷問の練習として得ます。 (例:インデックスがうまくいきません。参加しているデータを取得するだけで参加する必要がある場合は、ジョインが楽しいです。)

データが適切に正規化されている限りあなたはあまりにも多くの列を持っていないレベル。

編集:明らかにするには、キー/値のルートでしか解決できない問題があります。 「多すぎる列」はその1つではありません。

+0

+1。フィールド名を別のテーブルに置くことは、あなたにとって非常に困難なものにするでしょう。 – matt

+0

はい、私は、他のテーブル行に移動された場合、すべての値の要求を苦痛にすると考えています。 – Xeoncross

0

この本当にあなたがやろうとしているかに依存します。

4

どのくらいの数があまりにも多くあると言うのは難しいです。それは本当にとても主観的です。あなたが求めるべき質問は、「列が多すぎますか?」ではなく、「これらの列はここに属していますか?つまり、Userテーブルにユーザーのプロパティではない列があり、その列が属していない場合があります。たとえば、ユーザーの住所を集計した列がたくさんある場合は、それらをFKを使用してユーザーにAddress表にプルすることができます。

可能であれば、キー/値テーブルを使用しないでください。物事を拡張可能にする簡単な方法のように見えるかもしれませんが、実際は長期的には痛みです。あなたのスキーマが非常に一貫して変化していることがわかっている場合は、必要なものだけを変更するための何らかの変更管理を導入するか、MongoDBを使用したNoSQLのようなスキーマレスストレージをサポートしている別のテクノロジーCouchDB。

+1

私はこのアプリのほとんどのものが必要かどうか質問します。しかし、もう一度、私はちょうど雇われたプログラマーです。 – Xeoncross

2

テーブルの変更と追加は、ビジネス要件の変更を正確に反映していることを意味する場合、悪いことではありません。

1

変更と追加が連続している場合、おそらくあなたは座って要件を定義するより良い仕事をする必要があります。さて、私は30列がどれほど広いかどうかと、それが関係するテーブルに移動すべきものなのかどうかによって決まるとは言えません。あなたがphone1、phone2、phone3のようなフィールドを持っているのであれば、user_phoneの関連するテーブルに分割する必要があります。また、すべての列が幅広で(テーブル全体の幅がデータベースのデータを格納するページよりも広い)、クエリで頻繁に必要とされないものがある場合は、1対1の関係を持つ関連テーブルでは、 1つの関係。私はおそらくあなたが実際のパフォーマンスの問題を持っていない限り、これをしないだろう。

しかし、すべての可能な選択肢の、あなたは説明EAVモデルはmaintainabiltyとパフォーマンスの観点から、両方の最悪の一つです。このモデルに対してまともなクエリを書くのは非常に難しいです。

関連する問題