区域,区域,区域表都已填充。用户可以从表单中获取区域,区域和区域ID,用于临时地址和永久地址。什么是最好的数据库设计:
目前我在考虑:
用户表:
id name email region_id zone_id district_id tregion_id tzone_id tdistrict_id
但我怎么能建立关系? 1个用户可以有2个区域,每个区域用于临时地址和永久地址?即使我设置了很多关系,也不会有两个外键
就region_id
和tregion_id
而言?
答案 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, IsRented
和other desirable attributes
...
如果要向UserTable表添加一个字段,说IsCurrent,那么您可以通过简单AND condition
直接查询用户当前地址;
AND IsCurrent=1;