按地址我只是指普通地址,如国家,州,城市,地区,街道,建筑物,
其中地址可以像人一样在其他表中有效地引用 这样我们就可以选择同一个城市的人们呢? 谢谢。
答案 0 :(得分:5)
根据我的经验,您需要国家,州,城市,邮编,地址。
只有前三个/四个方便过滤用户。 Enum字段非常适合前两个字段。接下来的两个使用API进行了理想的验证 - 这将使您无需维护有效值列表。
我还没有碰到任何系统(虽然我认为邮局需要它,还有地理位置),需要将地址部分分成单个数据块以便进行更精确的过滤 - 以及每个用户有自己的方式进入后者。
请记住,有些国家没有州;其他人没有邮政编码;邮政编码格式因国家而异。
另外请记住,即使用户可以在系统中拥有多个地址,您最不希望的是将多个用户绑定到同一个address_id。它们通常更好地作为用户(或其公司)的详细信息,或作为后者的1-n相关细节;从不n-n。如果没有,UI问题就会迅速蔓延,并且有人会错误地编辑用户B的地址,因为后者碰巧与用户A共享它。
答案 1 :(得分:4)
这是一个用于地址表示的扩展数据库结构,
这种方法的优点
你可以稍后添加城市,国家,州。
2.它支持城市国家或州的编辑。
3.城市映射到州,同类州映射到国家。因此,您只需将城市存储在地址中即可。您不需要在每个地址中存储州和国家,从而减少冗余
4.只要用户选择国家/地区,您就可以生成状态列表。同样,您可以在用户选择州时生成城市列表。
Address
id INT PK AUTO_INCREMENT
street VARCHAR
city_fk INT FK
Zip_code VARCHAR
City
id INT PK AUTO_INCREMENT
name VARCHAR
state_fk INT FK
State
id INT PK AUTO_INCREMENT
name VARCHAR
country_fk INT Fk
Country
id INT PK AUTO_INCREMENT
name VARCHAR
user
id INT PK AUTO_INCREMENT
# other details
user_address_mapping # So that user can have multiple address
id INT PK AUTO_INCREMENT
user_fk INT FK # Link to user
address_fk INT FK # Foreign key to address
编辑:(感谢@Denis评论)
或者如果你的contry没有状态(或者你想要一个通用的解决方案),这里就是结构。
Address
id INT PK AUTO_INCREMENT
street VARCHAR
city_fk INT FK
state_fk INT FK
country_fk INT FK
Zip_code VARCHAR
City
id INT PK AUTO_INCREMENT
name VARCHAR
State
id INT PK AUTO_INCREMENT
name VARCHAR
Country
id INT PK AUTO_INCREMENT
name VARCHAR
user
id INT PK AUTO_INCREMENT
# other details
user_address_mapping # So that user can have multiple address
id INT PK AUTO_INCREMENT
user_fk INT FK # Link to user
address_fk INT FK # Foreign key to address
# Here user_fk & address_fk should be composite unique key, so that users can not share an address.
答案 2 :(得分:2)
很好地取决于你想如何规范化db,(仓库或交易)
示例1: 非标准化,一切都在一个表中
表名:用户
属性:userid,username,country
要检索的SQL:
select username from user where country="USA"
示例2: 规范化,一切都在单独的表中
表名:user attribute:userid,用户名,countryID
表名:国家 属性:countryID,国家/地区名称
要检索的SQL:
select username from user inner join country where country="USA"
您需要知道数据库用于确定“有效”方式的内容。