Address.City:字符串还是引用?

时间:2011-02-07 20:59:52

标签: database-design

我必须创建一个数据库,将存储大量的人及其地址,这些数据必须按地点搜索(即在该城市或其他城市找人)。

我怀疑是否应该将地址中的城市字段保存为简单varchar或创建城市表并引用它,以避免重复的城市名称等。

注意:我正在使用SQL-Server并将通过EF访问数据。

3 个答案:

答案 0 :(得分:0)

您当前的设计是否有ADDRESS varchar列,如下所示:?

"101 MAIN STREET, NEW YORK, NY, 10010"

如果是,那么如果你必须按街道,城市,州,邮编或组合进行搜索,那么你的生活会变得复杂。

我建议使用一个ADDRESS表,其中包含STREET,CITY,STATE和ZIP的单独列。这样您就可以单独查询每个。请务必为您使用的每个WHERE子句添加索引。

接下来的问题是进一步规范化是否有用(例如,CITY,STATE,ZIP的单独表格)和JOINing获取地址是否有用。我不确定是否有必要,但你可以尝试一下。

答案 1 :(得分:0)

我假设您的模型看起来像这样:

Address
--------------
Address
City
State
Zip

如果是这样,那么就无法消除City列中某些值的重复。如果您要创建City表,则城市名称将是自然键的明显选择,这意味着您的City列的实际数据将保持不变。如果您使用代理键,那么您只需重复该键值而不是城市名称。不过,我不建议使用代理密钥,因为城市名称不太可能改变,而且你会增加额外的间接水平而没有任何好处。

最后,有几个可能保证City表的潜在方案:

  • 您希望将与地址无关的元数据与城市记录相关联
  • 您希望在此字段上强制实施参照完整性。 I.E.您希望确定City的所有值都来自已存储在您的城市列表中的已知值列表。这还允许您向用户显示城市列表,而不仅仅是允许他们以自由格式文本输入数据。

如果其中任何一个适用于您,那么,无论如何,创建一个城市表。如果没有,则没有必要。

答案 2 :(得分:0)

背景

权限表 - 一个引用表,其中包含作为权限的“事物”的可能值。例如,国家/地区权限表将包含国家/地区的所有可能值。

答案

根据您对“巨额......”的定义,您肯定会想要一些权限表。 根据您地址的地理范围,部分或全部这些似乎是权限表的良好开端:

  1. 国家/地区 - 如果您允许超过1个国家/地区的地址,那么拥有权威表似乎是件好事
  2. 国家(或省) - 国家被分为普罗旺斯和/或州。这些是权威表的一个很好的候选者。
  3. 城市 - 城市(大多数)是具有已定义名称的固定实体。另一个anthority表的候选人。这应该包括城镇,村庄,城市和其他(农村居民可能不住在城市,村庄,城镇或其他任何地方)。
  4. 街道名称 - 街道的名称(或数字)(大部分)是固定的。这是权威表的候选者。街道名称将取决于城市,州和国家的组合,以使其独特。 例如城市“Blah”可能有一条名为“Mainne”的街道,而城市“NotBlah:可能没有名为”Mainne“的街道
  5. 邮政编码(美国的邮政编码)可能是权威表的候选者。例如,美国没有邮政编码00001。