我正在尝试找到一种更好的方法来将人名存储在表格中。 3字段超过1字段存储人名的好处是什么?
更新
以下是有关存储名称和用户体验的有趣讨论和资源
答案 0 :(得分:65)
您始终可以从其组件构造全名,但不能始终将全名解构为其组件。
假设你想写一封以“Dear Richie”开头的电子邮件 - 如果你有一个given_name
字段,你可以做到这一点,但是从他们的全名中弄清楚某人的名字是不是微不足道的。
您还可以按given_name
或family_name
或其他任何方式进行搜索或排序。
(注意我使用的是given_name
,family_name
等,而不是first_name
,last_name
,因为不同的文化将他们的名字命名为不同的顺序。)
在一般情况下解决这个问题很难 - 这是一篇文章,它说明了它有多难:Representing People's Names in Dublin Core。
答案 1 :(得分:36)
尽可能保持数据清洁!
如何?
在您提出要求时
如何存储名称无关紧要。重要的是 如果您骚扰具有必填字段的用户多次填写并重新提问,他们可能会感到不安,而不是立即购买您的应用程序。您希望始终避免糟糕的用户体验。 没有用户关心您搜索数据库中间名的容易程度。他希望有一种轻松,愉快的体验,就是这样。 如果用户被迫输入类似邮政地址的数据,甚至电子邮件地址只需要一个不需要通知的“只读”帐户,用户会怎么做?他们将垃圾数据放入您的系统。这将使您的超级搜索和排序算法无论如何都无用。 因此,我的建议是在任何应用程序中收集来自用户真正需要的信息,以便为他们提供服务,不再需要。 例如,如果您经营一家宠物食品在线商店,请不要在注册时询问您的用户他们拥有哪种宠物。一旦他们登录并且所有人都满意(新客户),他们可以选择填写。不要问他们他们的邮政地址,直到他们订购实际带到他们家的东西,他们支付的东西,因此关心你有他们的确切坐标。 这将带来更好的数据质量,这是您应该关注的,而不是用户没有受益的技术细节.... 在您的示例中,我只会询问全名(不确定),一旦用户愿意订阅您的简报,请让用户决定他/她希望如何解决...
答案 2 :(得分:16)
正如其他人所说,如何将全名分解为其组成部分。
你如何可靠地分解这批货?
答案 3 :(得分:12)
前几天我正在查找Spanish Civil War,并发现大多数规则都有这个例外:
下次我正在研究一个必须存储名称的系统时,我将尝试一些激进的东西:根据需求进行设计。
我们将使用这些名称?
根据名称的用途,我们确定要存储多少信息。也许我们允许用户输入所有这三个,包括第一种情况下的换行符(Generalissimo Franco可能希望列出他的完整头衔和约会,如果他还没有死的话)。也许我们提供First,Middle,Last,Generation作为选项,并将其余部分填入默认值。也许我们提供其他常见选项,如Surname,Given Name。
这与我在1975年开始编程COBOL之前使用过的旧式First,Middle,Last形成鲜明对比,从此以后一直“适应”。
答案 4 :(得分:11)
不幸的是,这有点像询问在数据库中存储数字的最佳方式。这取决于你将要用它做什么 - 有时你想要一个int,有时你需要一个字节,有时你想要一个浮点数。使用名称取决于您希望用户来自哪些文化,您计划使用名称做什么(您是否会使用这些名称连接另一个将名称存储为“姓氏,名字”的系统? ),以及你有多大可以惹恼你的用户。如果这是一个内部人力资源应用程序,你可能会给用户带来很多烦恼,并且有一个非常有条理的,正式的名称组件细分(有超过3个 - 不要忘记mr / mrs,jr,III,多个中间名,带有连字符的姓氏,如果你想要处理来自所有文化的名字,谁知道还有什么。如果你有一个用户可能会或可能不关心的webapp,你就不能要求他们过多关心。 / p>
答案 5 :(得分:7)
您可能希望在3个单独的字段中搜索一个字段,并且可以便宜地连接全名。
e.g。如果您想搜索所有Nolans先生,您的查询将是
SELECT Title+' '+FirstName+' '+Surname As FullName
from table where firstname = 'Mr' and surname ='Nolan'
只用全名来做这件事会很痛苦。
答案 6 :(得分:4)
我是英国人,只有一个名字。我通常把它放在'姓氏'字段中以便最不加重。我通常也被迫在“名字”字段中添加一些内容,根据定义,这是错误的。
任何强加“姓名”之外的行为的企图至少在某些时候注定是错误的,有时候对用户来说非常令人沮丧。单一的名字在印度南部,印度尼西亚和巴基斯坦(数亿人)以及像我这样的英国偶像怪人中很常见。
'第一,中,最后'的东西是以美国为中心的。很少有其他国家这样想过名字。请停止这样做。
答案 7 :(得分:4)
当您将名称分解为多个字段时,ORDER BY firstname
或ORDER BY lastname
等内容可能会发生。
将所有名称混合到一个字段时并不容易。
答案 8 :(得分:4)
保持字段分离允许您支持不同的输出格式和首先编写姓氏的文化
答案 9 :(得分:2)
大多数时候,它都支持写一些形式字母,比如“先生某某”,或者用姓氏来搜索/排序,这是很常见的。
鉴于第一/中/最后可能不适用于所有文化,可能有更好的方法。它可能更好地表达为“非正式名称”/“正式名称”/“法定名称”或类似名称。
此时,第一个/中间/最后一个是非常常见的,从数据输入的角度来看,这是每个人都期望的。
答案 10 :(得分:2)
关于我唯一能想到的是搜索目的。使用[=]搜索字段比使用[like]更好一点。
如果您不需要将名称显示为单独的单词,那么请使用单个字段。
但如果你需要做一些像[亲爱的阿丘先生]这样的事情,那么或许采用3场方法会更好。
答案 11 :(得分:2)
这就是事情,即使是人类也无法一直做到这一点,数据太多,特殊情况太多。我现在可以将我的名字改为20个部分,中间的13个作为我的“第一”名称。名称的一部分可以包含任意数量的单词,并且可以有任意数量的名称部分。有些人只有一个名字(没有姓氏)。有些人有很多中间名。有些人有第一个或姓氏由几个词组成。有些人首先列出他们的姓氏。有些人用他们的中间名。有些人使用与他们的名字无明显关系的昵称。
如果您尝试在软件中猜测这些约定,那么您将失败。期。也许你会在某些时候做到正确,甚至可能在大多数时候,但即便值得吗?在我看来,你应该将名字存储为一个字段,并通过使用名字来引用一个人来停止尝试变得可爱。如果您需要有关姓名的其他信息(例如昵称),请询问用户!
答案 12 :(得分:1)
灵活性。
e.g。 如果有人有一个双桶的姓氏,没有中间名。
答案 13 :(得分:1)
我投了一些这些答案,但如果您希望避免代码中的重复或冗余或混乱连接,您可以始终使用数据库中的计算列或类中的方法,该类公开名称一致重建。如果这些连接很昂贵(因为您要打印一百万个语句),则可以使用持久列。
通常,您将允许用户指定昵称或友好名称等名称,这样您就不会通过其记录中的名称或始终作为史密斯先生来引用它们。
这一切都取决于您的要求。没有预期会满足的环境,没有一个好的答案。
答案 14 :(得分:1)
如果您不需要按名字,中间名或姓氏排序或搜索,则没有任何好处。
答案 15 :(得分:1)
不确定它会有多实用,但也许如果文化敏感性在正在开发的应用程序的上下文中很重要,也许名称应该是一个集合,集合中的每个元素都带有一个值,表明该名称是否可寻址“名字”或可寻址的“姓”等等“标题”或其他需要识别的内容。名称ID可用于标识用于重新组成全名的元素的顺序。
答案 16 :(得分:1)
只有两个字段,“全名”和“首选名称” - 很简单。支持存在的每个名称(只要该语言具有词汇符号......所以,是的,不包括没有书面形式的语言)。
确保以某种unicode格式处理它们,并且该应用程序代码正确处理unicode转换。
答案 17 :(得分:1)
每个名称都是原子数据。当它们单独存储时,更容易以不同的格式打印出来,例如姓氏姓氏和姓氏,名字。
答案 18 :(得分:0)
对我而言,最好存储3个名称,以便稍后在需要单个组件时需要进行显式解析。
答案 19 :(得分:0)
你不能总是干净,可靠地将姓氏与全名分开,所以有充分的理由将其分开,因为你经常需要姓氏。在您这样做之后,有两种常见的方法:
(2)可以说是更可取的,因为人们有时会有两个以上的名字,(1)在这方面更不灵活。
另外,另一个常见字段是preferred_name(除上述内容外)。
答案 20 :(得分:0)
i18n问题无论如何都可能是一个错误。某些文化首先使用姓氏,最后使用给定名称,这会影响名字和姓氏的概念,因此我们移动到姓氏和名字的字段。 等待 ,某些文化没有姓氏,或姓氏因姓名的性别而被修改。
我们可以进入部落文化,这个人在成年后被重新命名。 “坐牛”的童年名字是“跳跃獾”
这有点像漫无边际,但我所展示的是,你拥有的字段越多,设计就越准确。应该至少有not null
'给定名称'字段和optional
'姓氏'字段绑定到PK
是一个整数。如果遵守上述要求,则可以添加字段而不会出现断开查询的问题。
答案 21 :(得分:0)
通过存储像PreferredName这样的附加列,可以解决一些问题。我们在数据库中执行此操作,并存储前缀列和后缀列。 例如 'Henry W Jones Jnr教授,首选名称为'Indiana Jones'。