2017-02-20 12 views
0

地域、ゾーン、地区表がすべて入力されています。ユーザーは、一時アドレスと恒久的な住所のそれぞれのフォームから地域、ゾーン、地区のIDを取得できます。ユーザーは2つのforeginキーを持っていますか?

ユーザーテーブル:

現在、私は考えています:

id name email region_id zone_id district_id tregion_id tzone_id tdistrict_id 

が、どのように私は関係を作ることができ、何がこのための最良のデータベース設計でしょうか? 1人のユーザーがそれぞれ2つの地域を持つことができます。たとえ私がセットアップ関係を持っていても、 という2つの外部キーがregion_idtregion_idの形で存在しないでしょうか?

答えて

1

同じテーブルに2つの異なる外部キーを持つことは、まったく問題ありません。モデルでは、異なるキーを定義する2つの関係を持つことができます。

public function region(){ 
    return $this->belongsTo(Region::class, 'region_id'); 
} 
public function tempRegion(){ 
    return $this->belongsTo(Region::class, 'tregion_id'); 
} 
+0

oh。代わりに領域hasMany関係はユーザーとは違いますか?なぜなら私は地域テーブルにuser_idを持っていないからです。代わりにユーザーのテーブルにregion_idがありますか? – Steve

0

データベースの設計には3NF以上必要ですが、一時的および恒久的に異なるフィールドを維持する必要はありません。また、複数の人が同じアドレスにとどまる場合のように冗長性を避けるために、同じアドレスが繰り返されます。

あなたのデザインは同様です。

1. User Table (id, name, email) 
2. Address Table (id, region_id,zone_id,district_id) 

UserAddressを言うユーザアドレス(1多くのまで)、ユーザー・アドレス割り当てのためのテーブルを必要とされる2つ以上の(将来性)の数値を格納するために、これは、あたりなどのようになります。以下;アドレス識別子フィールド、たとえばAddressTypeを追加します。以上で

3. UserAddress( 
    Id, UserId (FK to User), AddressId (FK to Address Table), 
    AddressType (Permanent/Temporary)) 

フューチャースコープ改善が

を変更する今、あなたは、2つ以上を必要とする意志この場合、ユーザーアドレステーブル内のユーザーがどのアドレスに滞在した期間の日付を維持する機会を、持っていますフィールド。

Id, UserId (FK to User), AddressId (FK to Address Table), AddressType, startDate, endDate, IsCurrent, IsRentedother desirable attributes ...

USERTABLEテーブルに1つ以上のフィールドを追加する場合はIsCurrentは、その後、あなたが直接、簡単なAND conditionにより、ユーザの現在のアドレスを問い合わせることができると言います。

AND IsCurrent=1; 
+0

とは何ですか? – Steve

+0

更新された回答を参照してください。 – Anil

+0

私はn個のアドレスを必要としません。 2つしかなく、両方とも強制的です。今はテキサスが意味をなさない?または私は理解していない? – Steve

関連する問題