如何设计优雅地代表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.
    

要回复问题请先登录注册