2009-09-17 76 views
2

我正在放置查找给定地址的最近位置的位置数据库。当我开始制定关于我的业务的表时,我想知道其他人在做什么以及是否有一些常见数据类型的“最佳实践”。如电话号码,地址甚至经纬度。SQL 2005标准数据类型

这是我到目前为止。任何建议或改进?

这些应该都是美国地址,FYI。

Column   DataType 
------  ------------ 
id   int 
city   nvarchar(100) 
address  nvarchar(100) 
address2  nvarchar(100) 
state   varchar(2) 
zip   nvarchar(10) 
phone   nvarchar(14) 
fax   nvarchar(14) 
name   nvarchar(100) 
latitude  float 
longitude  float 
notes   text 
+0

感谢您的编辑!更容易阅读。 – Mikecancook 2009-09-17 20:06:20

回答

1

考虑到你只想要美国地址,我会用varchar去传真,电话和邮编。你甚至可以使用varchar作为城市,地址和AddressExtra。

如果你打算打印地址,你可能需要一些方法来逐行分解,但你只有一列,可能有点短。

我会将笔记标准化到自己的表中,以便您可以按日期或类型跟踪笔记。

你可能希望有一个状态, “N” EW “d” uplicate, “X” 删除, “A” 莫如等

+0

我最初的想法是对所有东西都使用varchar。但是知道这里的情况如何变化,我认为我应该安全地使用nvarchar,以防万一加拿大或其他国家。 “最糟糕的计划”。虽然状态是一个好主意!我现在补充一下。 – Mikecancook 2009-09-17 20:08:26

+0

请...这是21世纪。人们和地理位置有各种奇怪的名字,字母不在US-ASCII之内 - 是的,甚至在美国。保存你自己,你的用户以及将来维护该数据库的人,遇到麻烦,并且只需使用Unicode就可以对来自外部世界的所有文本输入使用Unicode。 – 2009-09-17 20:45:08

+0

我还要指出,如果你打算随时使用SSIS,那么如果所有字符串数据都在nvarchar中,因为它想要使用它并且不会执行隐式转换,那么要容易得多。 – HLGEM 2009-09-17 21:08:05

3

我会使用VARCHAR(最大值),或nvarchar(最大)而不是文字...我认为文字是“老路”

2

你的电话号码应该支持更多的字符。在今天的VOIP电话网络中,有些从普通电话线路转换到VOIP电话线路的业务有时会给新的电话分机带来很大的影响。

例如,当我想打电话给我女朋友在工作中,我不得不拨像

1-888-555-5555 x667833

,如果你想存储它剥离即17字所有符号(18885555555667833)。如果你想允许自由文本(如1-888-555-5555请求Bob),你应该考虑更多的字符。

+0

好点!特别是因为这些位置来自多家供应商,我无法控制信息的传送方式。 – Mikecancook 2009-09-17 20:09:26

2

我发现使用从hCard microformat借来的名字很有用。其中有些是对的人,有的为地址,它不排队1:与使用hCard规格1,但是,这个子集已经相当有用至今:

honorificPrefix nVarChar(20) 
givenName   nVarChar(50) 
additionalName  nVarChar(50) 
familyName   nVarChar(50) 
nickName   nVarChar(50) 
honorificSuffix nVarChar(20) 
fn     nVarChar(50) -- # Formatted name 
email    nVarChar(255) 
title    nVarChar(50) 
role    nVarChar(50) 
organizationName nVarChar(100) 
organizationUnit nVarChar(100) 
streetAddress  nVarChar(100) 
extendedAddress1 nVarChar(100) -- # hCard specs support any number of these 
extendedAddress2 nVarChar(100) -- # I've not seen a need for more than two. 
locality   nVarChar(55) 
region    nVarChar(2) 
postalCode   nVarChar(20) 
postOfficeBox  nVarChar(20) 
countryName  nVarChar(50) 
phone    nVarChar(25) 
fax    nVarChar(25) 
latitude   float 
longitude   float 

经验表明,列出的数据类型和大小对于美国各地人员和组织的许多不同目录都有效。不过,我喜欢这里的一些评论,其中提出了一个更大的电话号码数据类型。另外,我不相信将纬度和经度作为浮点数存储是一条可行的路线,所以你的小数点可能会有所不同。

祝你好运!

+0

电子邮件为255?这让我难过。但他们并不是唯一这样做的人。例如,Paypal支持电子邮件只有127个字符。虽然这通常足够,但标准是320个字符。 – 2009-09-17 20:20:15

+0

否定,请参阅RFC 5321第4.5.3.1.3节。最大长度为256个字符,但其中包括电子邮件地址周围的尖括号。所以,最大长度实际上是254.回到RFC821,它也在RFC2821中。 – 2009-09-17 20:32:50

+0

我可以选择存储经度和纬度的数据类型。我读过这里的帖子:http://stackoverflow.com/questions/385132/proper-best-type-for-storing-latitude-and-longitude,但其中的大部分都在我的头上。 我将存储来自Google地图或其他服务的经度和纬度结果。如果它有什么区别,我打算使用Haversine公式计算距离并找到距离给定点最近的位置。 – Mikecancook 2009-09-17 20:40:14

0

该数据库将用于什么行业?

许多行业都有标准可以用来指导设计和实现对象,表格和数据类型。

例如,曾与医疗保健和保险信息,影响我的设计的一个标准是“ANSI ASC X12N 837医疗保健索赔(837)”。

如果您曾经期望从外部系统导入或导出信息,我会使用行业标准作为指导。

0

我不会这么大胆地调用这些最佳实践,但这里我学会了它的建议的硬件方式:

  • 一般:为nvarchar在这里随处可见使用过VARCHAR。跳过的列是可以的。
  • id:我更喜欢在这里使用uniqueidentifier。可能需要保持其在不同表格中的唯一性。使用newsquentialid()并在其上创建聚集索引。
  • 地址:设置其中三个。
  • 状态:更改为更类似领土的东西,并将其更改为nvarchar(100)。理想情况下,将其更改为territoryId(uniqueidentifier)并拥有包含这些表的另一个表。
  • 拉链:更改为POSTALCODE和大小增加到20
  • 电话:增加大小为50,我觉得最好不要涉足试图打破这件事验证的,除非你真的有一个很好的理由和计划使用它。
  • 传真:同手机
  • 笔记:此项更改为nvarchar(最大),这样你就不会在尽可能多的限制运行。
2

我不会使用浮动拉特长。我已经看到一些非常糟糕的四舍五入问题,并且经过长时间的计算会导致您错误的位置。改为使用小数类型,并定义您需要的位置数量。

+0

对此,每一个意见似乎都有很多分歧和很好的例子。例如:http://earthcode.com/blog/2006/12/latitude_and_longitude_columns.html与http://code.google.com/apis/maps/articles/phpsqlajax.html。 基本上我只想返回五个或十个最近的几个地点中的几个,然后显示真实地址。在一两英里之内,我想没有人会介意。如果我们说1000英里或更多......这将是一个问题。 – Mikecancook 2009-09-17 21:34:13

0

我从来没有想出如何“评论”,而不是“答案”

但我不遵守有关使用LAT /四舍五入问题过长的警告。度数四舍五入为两米以下的最大误差。如果你离两米远,你会失去吗?如果是这样,那么没有GPS设备将永远不会帮助你。

虽然如果您使用任何Google地图用于将地址转换为纬度/经度,您可能会离开一个街区。

相关问题