如何优雅地设计代表ADDRESS的数据库模式?

时间:2011-05-24 04:32:36

标签: database database-design database-schema

按地址我只是指普通地址,如国家,州,城市,地区,街道,建筑物,

其中地址可以像人一样在其他表中有效地引用 这样我们就可以选择同一个城市的人们呢? 谢谢。

3 个答案:

答案 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"

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