2012-04-03 7 views
1

私は2種類のユーザーを持つデータベースを持っています。何かのように:すべてのユーザーがUserですが、拡張サービスなどのためにサインアップした人も自分のアカウントに接続PowerUserを持ってデータベース:外部キーをどこに置くべきか?

User: 
    name: String 
    email: String 

PowerUser 
    address: String 
    paypalAcct: String 

UserPowerUserを分けたかったのですが、すでにPowerUserになっている人のためにUserテーブルを再利用するといいと思っていました。普通のものをすべて持っているはずですからUserです。

これは正しいことですか、UserフィールドをPowerUserテーブルに追加して、そのフィールドで作業する必要がありますか?

それを行うには正しいことであるならば、UserPowerUserを指す外部キーを持っている必要があり、またはPowerUserUserを指す外部キーを持っている必要がありますか?私はそれがこれらのものにアクセスする順序に依存すると思いますか?この場合、私はほとんどの場合、Userから、PowerUserという関連性があるかどうかをチェックします。

外部キーをUserに設定すると、多数のユーザーに外部キーがnullになります。外字キーをPowerUsersに入れると、それらはすべて埋められますが、UserからPowerUserになると、PowerUserのテーブル全体を反復する必要があります。どちらが望ましいですか?

-Haoyi

答えて

2

明白な答えは、外部キーを従属テーブルに追加することです。ユーザーはを必要としません。 PowerUser情報。

外部キーをPowerUsersに入れた場合、それらはすべて満たされますが、ユーザーからPowerUsersに行くにはPowerUsersテーブル全体を反復する必要があります。

あなたは反復する必要はありません。彼らはleft outer join syntaxを使用することにより、1つを持っている場合は、そのパワーユーザー情報を持つすべてのユーザーの一覧を取得することができます。

select 
    a.id, a.email, a.name, a.email, b.address, b.paypalacct 
from 
    users a 
    left outer join powerusers b on a.id = b.id 

あなたが唯一のパワーユーザーの一覧を取得したい場合は、あなたがinner joinを使用しています。

select 
    a.id, a.email, a.name, a.email, b.address, b.paypalacct 
from 
    users a 
    inner join powerusers b on a.id = b.id 
1

あなたはnearlly自分で答えている:

あなたは、単一のテーブルを使用する場合は、ヌルがたくさんあります。ヌルは特に索引付けには適していません。だから、別のテーブルを使うのが良いでしょう。

FKに関しては、PowerUserにFKを追加すると、この2番目の表の主キーとなるnot null列が作成されます。だから、ユーザーのためのPowerUserエントリを見つけることは本当に速いです。

User: 
    id   INTEGER NOT NULL PRIMARY KEY 
    name   VARCHAR 
    email   VARCHAR 

PowerUser: 
    id   INTEGER NOT NULL PRIMARY KEY REFERENCES(User.id) 
    ... 

技術的に、あなたはまた、ユーザー名を使用することができますが、変更するときには、主要な口論につながる、:(それは一般的に、ユーザー・アカウント・データにあるよう)

1

アン簡単に割り出し可能サロゲートキーはpreferrableですこれは、ほぼすべてのユーザーデータベースに表示されます。 PRIMARY KEYインデックスは、実際のパフォーマンス上のペナルティがないように、ルックアップを十分に速くします。

関連する問題