2012-03-12 15 views
1

多くの列を含む表は、悪い設計を示していますか?たとえば、ユーザー情報とユーザー設定を格納する次の表があります。データベースデザインと大きなテーブル?

[Users table] 
    userId 
    name 
    address 
    somesetting1 
    ... 
    somesetting50 

サイトにはさらに多くの設定が必要なため、私の考えでは、この表は正規化され、すべての設定はuserIdに依存しています。

多くの列があるテーブルに対しては、私には間違っているようですが、テーブルから返すデータを選択できることを思い出しました。テーブルが大きい場合は、コード内の異なるオブジェクトたとえば、

[User object] 
[UserSetting object] 

を入力し、これらのオブジェクトを満たすデータのみを返します。

上記の一般的な方法、または使用するのに適した列が多い表を扱う他の方法はありますか?

答えて

-1

最適なSELECT速度を得るには、インデックスが一致するいくつかのテーブルを使用します。 JOINを使用してテーブル間の情報を関連付ける方法として、インデックスを使用します。

+1

また、リレーショナルデータベース管理システムを使用する必要があります。 –

1

私はそれが悪い表のデザインだと思います。ユーザーがこれらの50の設定のうち47項目のエントリを持っていない場合は、テーブルに多数のNULLがありますが、これは適切な方法ではなく、パフォーマンスも低下します(NULLを特別な方法で処理する必要があります) 。代わりに

、以下があります。

ユーザテーブル ID、 姓 姓 など

SETTINGS ID、 SettingName

ユーザー設定 ID、 SettingId、 ユーザーID、 設定値

あなたはその後、多くの人が参加するために多くを持っている、と排除NULLの

2

私はあなたがこのように複数のテーブルを使用すべきだと思う:

[Users table] 
    userId 
    name 
    address 

[Settings table] 
    settingId 
    userId 
    settingKey 
    settingValue 

テーブルは、あなたが取得するために使用できるのuserId列によって関連していますあなたが必要とするユーザのための設定。

+1

私は 'settingId'カラム(おそらくプライマリキーです)を避け、ナチュラルキー'(userId、settingKey) 'を使いたいと思っています。 –

0

属性表を検討できます。限り、あなたのインデックスが優れているとして、あなたは、パフォーマンスの問題のあまりを持っていません。

[AttributeDef] 
    AttributeDefId int (primary key) 
    GroupKey varchar(50) 
    ItemKey varchar(50) 
    ... 

[AttributeVal] 
    AttributeValId int (primary key) 
    AttributeDefId int (FK -> AttributeDef.AttributeDefId) 
    UserId int (probably FK to users table?) 
    Val varchar(255) 
    ... 

は基本的に、あなたは以下の列を持つ2つのテーブルに多くの列を使用して、テーブルを「ピボット」です。この構造の周りにビューと表関数を記述して、関連するアイテムのグループまたは特定のアイテムのみのデータを提供することができます。また、属性定義表に他のものを追加して、必要なデータ要素、など

このタイプのデザインについて考えてみましょう。

+0

多分私はそれをあまりよく理解していないかもしれませんが、私はこのアプローチに夢中ではありません:( – chobo

1

最初に、テーブル名にスペースを入れないでください。すべての[括弧]は本当の痛みになります!

50個の列がある場合、各ユーザーのデータはどれだけ意味がありますか?ヌルがたくさんありますか?ほとんどのデータは、特定のユーザーには適用されない場合もあります。あなたが唯一のユーザーごとにUsers行を持っている必要があります

Users:    --main table where most values will be stored 
    userId 
    name 
    address 
    somesetting1 ---please note that I'm using "somesetting1", don't 
    ...    --- name the columns like this, use meaningful names!! 
    somesetting5 

UserWidgets   --all widget settings for the user 
    userId 
    somesetting6 
    .... 
    somesetting12 

UserAccounting  --all accounting settings for the user 
    userId 
    somesetting13 
    .... 
    somesetting23 

--etc.. 

し、そのデータが適用される各テーブル内の行:あなたは論理的なグループに「設定」を打破する1〜1テーブルを、考えて与えられたユーザ。ユーザーはウィジェット設定を持たず、そのユーザーの行はありません。必要に応じて各テーブルをLEFT結合して、必要に応じてすべての設定を取得することができます。通常は、実行中のアプリケーションのどの部分に基づいて一連の設定を行う必要があります。つまり、すべてのテーブルに参加する必要はなく、その時点で必要なものだけを取り込むことができます。

+0

上記のテーブルはデータベースの1対1の関係になるでしょうか?大規模なテーブル(それらはnullsフィールドではありません)とそれを別のクラスに分割し、クラスを満たすために必要なクエリデータのみを使用してください。 – chobo

関連する問題