【问题标题】:How to store country and state in sql server如何在sql server中存储国家和州
【发布时间】:2015-04-14 21:39:23
【问题描述】:

我正在创建一个类似于 youtube 的视频网站,但它的目标是独立游戏社区。

我正在设计表格,但在位置列方面遇到了一些绊脚石。

各大网站如何设计存储位置的表格?

Profile表:

ID | username | country | state
0  | jack     | US      | New York
1  | ted      | Canada  | Alberta

ID | username | countryID
0  | jack     | 1
1  | ted      | 2

Regions表:

ID | country | state
0  | United States | Texas
1  | United states | New york
2  | Canada        | Alberta

还是我错过了其他一些设计?

【问题讨论】:

  • 我讨厌您存储用户名,它不是 user_id 列或其他标识符。大多数设计会将位置非规范化到保持位置(国家、州、省、城市、邮政编码)的程度。因此,您的个人资料表将是(ID、用户名、site_id)。
  • ID 是我的表的主键。我没有使用用户名作为主键,这是你的意思吗? site_id 列的用途是什么?
  • 抱歉,site_idregions 表中的ID 列相关。请原谅我误读的最后一部分,但它确实引出了另一个问题,您的个人资料表是主要用户表吗?如果用户更改了他们的个人资料或者这是一对一的永久联系怎么办?
  • 不用担心,这是一对一的关系,他们只能有一个位置
  • 但是一个user可以只有1个profile吗?

标签: sql-server database normalization


【解决方案1】:

我不知道“大”网站如何处理他们的数据,但无论如何我认为这将是一个偏好和业务需求的问题,在第一种情况下,表格没有正确规范化,因为状态取决于国家/地区,而在另一种情况下,模型 [几乎] 被适当地标准化(国家可以移动到另一个表)。第一个选项在进行查找等时可能会更快,但由于它破坏了规范化的关系模型,因此在插入/更新数据(以及额外的存储空间)时可能会导致问题。就我个人而言,我会选择使用第二个选项(如果需要,可能会将其反规范化以进行分析处理 - 我认为这在很大程度上取决于您希望处理的数据量)

标准化模型看起来像:

profile (**username**, state)
states (**state**, country)
countries (**country**)

上面的例子没有使用代理键,只是说明了模型;模型的数据库实现通常会使用代理键,例如 UserID、StateID 和 CountryID,但如果适当规范化,则不需要它们,因为实体应该是主键(因为它们是候选键)。

【讨论】:

  • 第二个选项在技术上不是也没有标准化,因为国家重复了吗?
  • 同意。我认为像位置数据这样的非规范化是非常标准的。国家/地区名称变化不大那么,但值得注意的是,如果您需要输入“USA”并且它需要是“United States of America”,那么您会看到数千更新声明。
  • @LeslieJones 啊,是的,我想我写得太快了。没错,国家应该存储在另一个表中才能完成标准化。
  • 所以我想为了完美的标准化,会有一个国家表和另一个地区表。
  • @jpw,即使是另一个表中的国家/地区,它仍然没有标准化。示例:美国 -> 密歇根州 -> 奥克兰县 -> 麦迪逊高地市 -> 邮编 48071-9999。 zip 中的 48 表示状态,0 表示路由设施,71 表示本地 PO,-9999 表示块。这有点疯狂,在这种情况下反规范化是很正常的。
【解决方案2】:

然后呢:

profile Table
ID | username | stateID
0  | jack     | 1
1  | ted      | 2

states table
ID | countryID | state
0  | 0 | Texas
1  | 0 | New york
2  | 1 | Alberta

countries table
ID | country
0  | United States
1  | Canada      

【讨论】:

  • 我认为这是最好的解决方案。谢谢你的回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多