普通人字段(姓名,电子邮件,地址,性别等)上的最佳做法


Answers:


50

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

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

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

24

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

一些注意事项:

地址:

名称:

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


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

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

2
Wayback Machine的文章为“姓氏第一”:web.archive.org/web/20160823135055/http
//www.solidether.net/…– Av Pinzur

10

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

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

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


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

9

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

电子邮件地址:

最少: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行和第3行(如果需要)。

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

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

派对地址

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

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

电话号码

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

电话号码

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

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

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

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

派对电话号码

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

名字

名字很难。原因如下:

  1. 有些人的法定姓氏只有一个字http://en.wikipedia.org/wiki/List_of_legally_mononymous_people

  2. 某些人的名字中包含许多单词http://en.wikipedia.org/wiki/Wolfe%2B585,_Senior

  3. 有些人同时拥有多个名字(例如,在我的大学里有很多亚洲学生,但他们喜欢使用“首选的”更西化的名字)

  4. 有时,您需要随着时间的推移跟踪人们的姓名,例如婚前姓氏和已婚姓氏。

  5. 您出于各种充分的理由想要抽象个人和组织

    创建表方(id bigserial主键);

    创建表party_name(id bigserial主键,party_id bigint不是null引用party(id),类型smallint不是null引用party_name_type(id)-已消除,例如“ maiden”,“ legal”);

    创建表name_component(id bigserial主键,party_name_id bigint不是null引用party_name(id),键入smallint不是null引用name_component_type(id),-省略ex“给定”名称文本,不null);


3

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

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

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


3

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

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


1
或荷兰人的名字,例如我的姓氏。
科林·哈特
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.