最常见的长度和数据类型最佳实践是什么,例如:



姓氏
地址
电子邮件
性别
国家
城市
国家
电话号码

等....

评论

这个问题很广泛。应该清除并删除它。

相关:通过将街道地址分成多个单独的列可以解决哪些问题?

#1 楼

对于任何通用的最佳实践,我都会非常怀疑,因为对于大多数这些领域,细节决定成败。仅仅因为信息相对普遍并不意味着您的应用程序使用数据的方式与其他应用程序使用数据的方式完全相同。这意味着您的数据模型可能需要稍有不同。


名和姓:为什么要捕获名称?如果您需要捕获某人的全名(例如,您正在准备法律文件或出生证明),那么您可能想给人们提供比仅输入某人的名字更多的空间,以便您输入在您的新Web应用程序中可以调用它们。
地址:您要使用该地址做什么?您要存储哪种地址?如果您要存储要在其上建立抵押的美国房地产的地址,则可能会非常在意获得完全标准化的地址,在这种情况下,数据模型可能会希望与您的任何地址都非常接近标准化工具的回报。如果您只希望人们能够输入一个地址来交付产品,那么两行自由格式的文本可能就足够了。行的长度可能取决于执行诸如打印地址标签之类的下游流程的要求。
状态:假设您可以识别有效的状态值,则创建STATE表并创建一个STATEADDRESS表之间的外键关系。但是,识别有效值的能力意味着您将有效地址集至少限制到特定的国家/地区。对许多站点来说都很好,但是您需要做一些工作来支持一个新的国家。
城市:如果您要处理的数据可能存在地方一级的法规(即根据城市适用不同税率的地方),则可能需要像州一样对待它, CITY表与有效城市以及CITYADDRESS表之间的外键关系。另一方面,如果您只是想交付产品,并且您不太在意表中是否有同一个城市的各种版本,那么让用户自由输入文本就足够了。当然,如果要存储外键,则需要进行大量工作以确保拥有所有有效值。但是有些产品的重点是该公司已经完成了这项工作(即营业税数据库)。
电话:您在用电话号码做什么,为什么呢?某些应用程序将希望采用用户决定输入的任何格式的电话号码,并为以后的所有查询保留该格式。如果要设计一个个人通讯录,这对用户来说是很常见的,其中用户对于如何存储和显示电话号码有自己的偏好。其他应用程序将要忽略输入的格式,只提取数字字符,然后在检索时格式化数据,以便所有电话号码都具有类似的格式。如果要满足企业需求,则可能需要一个单独的字段供用户输入扩展名。如果您想支持外拨电话流程,则可能需要将区号和国家/地区代码存储在单独的列中,因为您将要确保有特定于时区的窗口,以用不同的区号给人们打电话(在上午10点拨打东部时区的电话比在上午7点拨打太平洋时区的电话要好得多。
性别:对于许多应用程序,在表中存储性别代码(“ M”或“ F”)是完全合理的。另一方面,在某些情况下,您可能需要其他选项(“其他”,“两性”,“变性”),或者需要存储诸如出生时的性别和当前性别之类的信息。


评论


有趣的答案,需要考虑很多事情-但缺少任何有用的想法来帮助人们进一步发展...例如,电话里有一个非常简单的东西,可以覆盖> = 80%的情况:您可以输入的数字可以通过电话联系到某人,也许还要覆盖其他国家/地区。所以是的,如果您认为一个数字可以带/不带国家/地区前缀,则会有几个字符的区别,但是肯定有一个像世界上最长的电话号码之类的东西,对于大多数人来说,使用这个数字再加上几个是相当安全的案件

–亨宁
18年3月14日在15:38

#2 楼

您还可以根据样本数据和预期的受众进行猜测。这取决于您的位置。

一些注意事项:

地址:


我没有州,这激怒了我当我必须选择“美国以外地区”时
英国邮政县与地方政府的顶级地区没有相似之处:请参见SO上的“国际国家细分的列类型和大小(州,省,地区等)”,我打破了某人的假设

姓名:


别忘了姓氏,姓氏,俗称,部落名称,守护神,世代名等
请参阅“虚假信息程序员相信名称”,然后考虑哭泣
请参阅“姓氏优先”,然后哭泣
所以“您能期望的最长的人类名字是什么?”举一个可行的例子

电话号码:国际代码,长度,手机号码与房屋号码,允许手机作为唯一号码

评论


最后两个链接(“姓氏优先”和“最长的时间...”)断开。

– Marc L.
17年2月27日在14:50

@马克我修复了“姓氏优先”链接(如果我的编辑被接受)。 “最长的时间是什么...” SO问题已被关闭,因为“不是建设性的”问题,已被删除(如果您的代表> 10k,您仍然可以看到它)。

–ax。
17年11月13日在18:23

Wayback Machine的文章为“姓氏优先”:web.archive.org/web/20160823135055/http://www.solidether.net/…

– Av Pinzur
18年8月20日在19:52

#3 楼

除了上述出色的答案外,别忘了接受unicode字符。仅仅因为您在美国并不意味着您不想在列中接受外来字符。

我通常建议使用50个字符作为名称。 320个足够用于一个电子邮件地址(您可以检查ANSI标准以确定)。对于地址错误,请谨慎使用255个字符。尽管您可能永远不需要那么大的地址,但是如果您包括C / O线之类的东西,则可能会需要。城市应该很大,那里有一些很长的城市名称。对于州,请使用子表,与国家/地区相同。对于邮政编码,请不要忘记比美国邮政编码长的国际邮政编码。只是因为您不支持国际,您仍然可以。有很多美国公民生活在不同的县,包括军人。

别忘了州应该是可选的,因为许多国家没有州。

评论


在我的上一个项目中,我找到了一份有关国际邮政标准的文档,其中指出39为最大行长。法国针对城市之后的大量接收者制定了单独的代码。我会允许此大小加上国家/地区的3或4个自由格式字段。

–BillThor
2011年7月12日在18:35

#4 楼

我的屁股因为坐在篱笆上而变得酸痛,所以我只想提出一些答案,并希望不要被遗忘。请提出建设性的批评。

电子邮件地址:

分钟:6(a@g.cn)。或3,如果您想跟踪本地域的电子邮件地址
最大值:320 254(RFC)

用于验证电子邮件的代码量实际上是疯狂的,因此,让我们假设它是否有效带有“ @”

您可能希望将电子邮件地址抽象为“通信方法”,以便您可以轻松列出与用户通信的所有方法。

性别

性别会随着时间而变化,因此您可以跟踪它是否对您很重要。按照http://en.wikipedia.org/wiki/ISO/IEC_5218

NOT_KNOWN(0),
MALE(1),
FEMALE(2),
NOT_APPLICABLE(9);


地址:NORAM

我要便宜

主要由于征税,可以方便地提取国家,地区,城市和县。税收可以适用于多个级别,因此,如果您可以将税率指向抽象的地理区域,那您就很聪明。

地理区域:

id: int  
type: {country, division, county, city, indian reservation}  
name: varchar(45)  [1]
abbreviation: nullable varchar(4)  
parent_id: nullable int  


地址:

id: int  
postal_area_id: int, references GeographicArea  
county_or_city_id: int, references GeographicArea  
street_address: varchar(255)  
suite: nullable varchar(255)  


添加第2行,并line3,如果需要的话。

请参见http://en.wikipedia.org/wiki/Address_(地理)

现在,地址就是地址。一个人可以住一个地址,一个人可以同时有多个地址,随着时间的流逝,因此您需要一个多表。

PartyAddress

party_id: int references Party  
address_id: int references Address  
purpose: {home, work, ...}  


如果随时间进行跟踪,请添加from_date和可为空的to_date

电话号码

一个聚会可以有多个电话号码,一个电话号码可以被多个人使用。电话号码可以用于传真,电话,调制解调器等,并且可以具有分机号。这些也都可以随时间变化。

PhoneNumber

id: int  
value: varchar(15) - the max allowed by the ITU  


最小值可能是3(对于“ 911”而言),或者可能是7(“ 310-4NET”,这是一种特殊的本地号码,不允许您拨打区号)

您如有必要,可以将其拆分为国家代码,等等。

您应该使用http://en.wikipedia.org/wiki/E.164标准

PartyPhoneNumber

party_id: int references Party  
phone_number_id references PhoneNumber  
extension: nullable varchar(11) - ITU max  
purpose: {home, work, fax, modem, ...}  


名字

名字很难。原因如下:


有些人的法定姓名只有一个单词http://en.wikipedia.org/wiki/List_of_legally_mononymous_people
有些人的姓名中有很多单词http://en.wikipedia.org/wiki/Wolfe%2B585,_Senior
有些人同时具有多个名字(例如,在我的大学里有很多亚洲学生,但是他们喜欢使用“首选”(更西化的名字)。
有时,您需要随着时间的推移跟踪人们的名字,例如婚前姓氏和已婚姓氏。

您希望抽象出个人和组织来获得各种好处原因

创建表party(
id bigserial主键
);

创建表party_name(
id bigserial主键,
party_id bigint不是null引用party(id),
type smallint不是null引用party_name_type(id)-已消除,例如“处女”,“合法”
);

创建表name_component(
id bigserial主键,
party_name_id bigint不是null引用party_name(id),
类型smallint不是null引用name_component_type(id),--elided ex“ given”
name text not null
);



#5 楼

从与以前的回答略有不同的角度来看,既然可以谈论LDAP似乎是可以的,那么RFC 4519-“轻型目录访问协议(LDAP):用户应用程序的架构”可能会引起人们的兴趣。

如果您的应用程序需要映射到这样的目录,则可能会很有用。否则,它可能不适合您的要求。

这些定义不仅涉及数据,还涉及一些可在字段上使用的运算符。 postalAddress例如是caseIgnoreListSubstringsMatch。我并不是建议您严格遵守此架构,但是查看原则可能会很有趣,尤其是您可能必须比较应用程序中的名称和地址可能与数据库的设计有关。 >

#6 楼

关于名称,请考虑使用双引号,这样就不必在爱尔兰或意大利名称(例如O'Hara或D'Amato)中使用撇号。

我还建议您使用一组好的正则表达式,以便您可以输出部分名称字段(例如,首字母缩写,昵称,Jr / Sr等)。

评论


或荷兰人的名字,例如我的姓氏。

–科林·哈特(Colin't Hart)
15年5月20日在9:06