Sql server 如何在sql server中存储国家和州

Sql server 如何在sql server中存储国家和州,sql-server,database,normalization,Sql Server,Database,Normalization,我正在创建一个类似于youtube的视频网站,只是它的目标是独立游戏社区 我正在设计桌子,在位置栏遇到了一些障碍 主要站点如何设计存储位置的表 Profile表格: ID | username | country | state 0 | jack | US | New York 1 | ted | Canada | Alberta ID | country | state 0 | United States | Texas 1 | United state

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

我正在设计桌子,在位置栏遇到了一些障碍

主要站点如何设计存储位置的表

Profile
表格:

ID | username | country | state
0  | jack     | US      | New York
1  | ted      | Canada  | Alberta
ID | country | state
0  | United States | Texas
1  | United states | New york
2  | Canada        | Alberta

地区
表格:

ID | username | country | state
0  | jack     | US      | New York
1  | ted      | Canada  | Alberta
ID | country | state
0  | United States | Texas
1  | United states | New york
2  | Canada        | Alberta
还是我错过了其他设计?

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

标准化模型的外观如下所示:

profile (**username**, state)
states (**state**, country)
countries (**country**)
上面的例子没有使用代理键,只是说明了模型;模型的数据库实现通常会使用代理键,如UserID、StateID和CountryID,尽管如果正确规范化,它们不应该被需要,因为实体应该是主键(因为它们是候选键)。

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

标准化模型的外观如下所示:

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

那么:

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      
那么:

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      


我讨厌你存储用户名,它不是一个用户id列或另一个标识符。大多数设计都会对位置进行非规范化,以保留它的位置(国家、州、省、市、邮编)。因此,你的配置文件表应该是(id、用户名、站点id).ID是我的表的主键。我没有使用用户名作为主键,这是你说的吗?site\u ID列用于什么?对不起,
site\u ID
将与
regions
表中的
ID
列相关联。请原谅最后一部分我有点误读,但它确实需要另一个问题,您的配置文件表是主用户表?如果用户更改其配置文件或是1:1的永久连接怎么办?不用担心,这是一种1对1的关系,他们只能有一个位置,但是
用户
只能有一个
配置文件
?我讨厌你存储用户名,它不是用户id列或另一个标识符。大多数设计都会反规范化要保留it位置的位置(国家、州、省、市、邮编)。因此您的配置文件表将是(ID、用户名、站点ID).ID是我的表的主键。我没有使用用户名作为主键,这是你说的吗?site\u ID列用于什么?对不起,
site\u ID
将与
regions
表中的
ID
列相关联。请原谅最后一部分我有点误读,但它确实需要另一个问题,您的配置文件表是主要用户表?如果用户更改其配置文件或是1:1的永久连接怎么办?不用担心,这是一种1对1的关系,他们只能有一个位置,但是
用户
只能有一个
配置文件
?第二个选项在技术上不是也不规范,导致国家重复吗?同意。我认为非规范化是正确的类似gs的位置数据是相当标准的。国家名称变化不大,但值得注意的是,如果您需要输入“USA”,并且需要输入“美利坚合众国”然后你看到的是一个数千个update语句。@LeslieJones啊,是的,我想我写得有点太快了。你是对的,国家应该存储在另一个表中,以便完成标准化。因此,我想,要实现完美的标准化,应该有一个国家表和另一个地区表。@jpw,即使国家在其他表仍然没有标准化。例如:美国->密歇根州->奥克兰县->麦迪逊高地市->邮政编码48071-9999。邮政编码中的48表示该州,0表示路由设施,71表示本地PO,-9999表示该区块。这有点疯狂,de非常正常-在这种情况下进行规范化。第二个选项在技术上不是也不规范,因为国家重复出现吗?同意。我认为位置数据之类的非规范化是相当标准的。国家名称没有太大变化,但值得注意的是,如果您需要输入“USA”,并且需要输入“美利坚合众国”然后你看到的是一条数千条update语句。@LeslieJones啊,是的,我想我写得有点太快了。你是对的,国家应该存储在另一个表中,以便完成标准化。因此,我想要实现完美的标准化,应该有一个国家表和一个