用户有两个外键吗?

时间:2017-02-20 06:39:13

标签: php laravel database-design

区域,区域,区域表都已填充。用户可以从表单中获取区域,区域和区域ID,用于临时地址和永久地址。什么是最好的数据库设计:

目前我在考虑:

用户表:

id  name  email  region_id  zone_id  district_id  tregion_id  tzone_id  tdistrict_id

但我怎么能建立关系? 1个用户可以有2个区域,每个区域用于临时地址和永久地址?即使我设置了很多关系,也不会有两个外键  就region_idtregion_id而言?

2 个答案:

答案 0 :(得分:1)

对同一个表有两个不同的外键是完全没问题的。在模型中,您可以有两个关系来定义不同的键:

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

答案 1 :(得分:0)

您的数据库设计应至少达到3NF,然后您可能不需要为临时和永久保留不同的字段。同样为了避免冗余,例如在多个人停留在同一地址的情况下,相同的地址将重复。

您的设计可能相似;

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

要存储两个或更多(未来证明)的用户地址数量( 一对多 ),您需要一个用户地址分配表,例如UserAddress,这将如下所示;添加地址标识符字段AddressType

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

未来范围改进,变化最小

现在您还有机会维护日期,用户在哪个时间段内停留在哪个地址,在这种情况下,用户地址表将需要两个以上的字段。

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

如果要向UserTable表添加一个字段,说IsCurrent,那么您可以通过简单AND condition直接查询用户当前地址;

 AND IsCurrent=1;