如何解决如何设计优雅地代表ADDRESS的数据库模式?
| 按地址,我只指国家,州,城市,地区,街道,建筑物, 可以在其他表格(例如人员)中有效引用地址的地方, 这样我们就可以选择同一城市中的人? 谢谢。解决方法
取决于您要如何规范数据库(仓库或事务)
范例1:
未归一化,一切都放在一张桌子中
表名:用户
属性:用户名,用户名,国家
sql检索:
select username from user where country=\"USA\"
范例2:
归一化,所有内容都在单独的表中
表名:用户
属性:userid,用户名,countryID
表名:国家
属性:countryID,国家/地区名称
sql检索:
select username from user inner join country where country=\"USA\"
您需要知道数据库用于确定“有效”方式的方式。
,以我的经验,您需要国家,州,城市,邮政编码,地址。
仅前三个/四个方便过滤用户。枚举字段非常适合前两个字段。理想情况下,以下两个使用API进行了验证-这将避免您需要维护有效值列表的麻烦。
我还没有遇到过任何需要将地址部分分成单独的数据块以进行更精确过滤的任何系统(尽管我认为邮局会需要它以及地理位置),此外,每个用户都有自己的自己进入后者的方式。
请记住,有些国家没有州。其他人没有邮政编码;邮递区号格式因国家而异。
还要记住,即使一个用户在系统中可以有多个地址,您最后要做的就是将多个用户绑定到同一个address_id。通常最好将它们放在用户(或他们的公司)的详细信息中,或放在与后者有关的1-n相关信息中;永远不会n-n。否则,UI问题会迅速蔓延,有人总是会错误地编辑用户B的地址,因为后者恰巧与用户A共享了地址。
,这是一种用于地址表示的扩展数据库结构,
这种方法的优势
1.您可以稍后添加城市,国家/地区,州。
2.它支持城市国家或州的编辑。
3.城市映射到州,并且类似地州映射到国家。因此,您将仅将城市存储在addrss中。您无需在每个地址中存储州和国家/地区,从而减少了冗余。
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.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。