2011-05-24 40 views
4

的地址,我只说像国家,州,市,区,街道,建筑物的正常地址,如何优雅地设计表示ADDRESS的数据库模式?

地址在哪里可以在喜欢的人其他表可以有效地引用, 这样我们就可以在同一个城市选择的人等等? thx。

+1

的可能重复的[用于在数据库(RDBMS)存储邮递地址的最佳做法?](http://stackoverflow.com/questions/310540/best-practices-for-storing-postal-addresses-in -a-database-rdbms) – 2011-05-24 11:43:03

回答

2

好取决于你想如何正常化分贝,(仓库或交易)

例1: 非标准化的,一切都在一个表

表名:用户

属性:用户ID,用户名,国家

SQL检索:

select username from user where country="USA" 

实施例2: 归一化,一切都在单独的表中

表名:用户 属性:用户ID,用户名,countryID

表名:国家 属性:countryID,国家名称

SQL来检索:

select username from user inner join country where country="USA" 

您需要知道数据库用于确定“有效”的方式。

4

根据我的经验,您需要国家,州,城市,邮编,地址。

只有前三/四个方便过滤用户。 Enum字段非常适合前两个字段。接下来的两个使用API​​进行了理想的验证 - 这将免去您需要维护有效值列表的麻烦。

我还没有遇到任何系统(尽管我假设一个邮局需要它,以及地理定位),需要地址部分在单个数据块中分块以进行更精确的过滤 - 另外,每个用户有自己的方式进入后者。

请记住,有些国家没有国家;其他人没有邮政编码;而且从一个国家到另一个国家邮政编码格式差别很大。

还要记住,即使用户可以在系统中拥有多个地址,最后要做的就是将多个用户绑定到同一个address_id。它们通常更适合作为用户(或其公司)的细节,或者作为与后者相关的1-n相关细节;从来没有n-n。如果不是,UI问题迅速蔓延的,会有人总是编辑错误用户B的地址,因为后者正好与用户A

3

这里分享一个扩展数据库结构的地址表示,
优势采用这种方法
1.您可以稍后添加城市,国家,州。
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. 
+1

那么......当一个国家没有国家时,它也不会有城市吗? :-) – 2011-05-24 11:31:39

+0

你可以拥有与国家同名的单一国家,请参阅我是天才:P :) – 2011-05-24 11:40:39

+0

解决方案1,如果我们需要由国家的人员进行搜索,将会有许多加入到国家/地区表中从用户来说,这会变得效率低下吗?同时,当我们使用或映射时,代码非常长,如USEROBJECT.ADDRESS.CITY.STATE.COUNTRY,对于解决方案2看起来有点不方便 – hetaoblog 2011-05-25 04:40:33