数据库-名,中间名,姓。 为什么不全名?

我试图找到一种更好的方法来在表中存储人们的姓名。3个字段比1个字段存储人名有什么好处?

更新

这是有关存储名称和用户体验的有趣讨论和资源。

将名字/姓氏合并到一个字段中

ashraf asked 2020-08-05T00:11:41Z
22个解决方案
64 votes

您始终可以从其组件中构造一个全名,但不能始终将其分解为一个全名。

假设您要写一封以“ Dear Richie”开头的电子邮件-如果您有given_name字段,则可以轻松地做到这一点,但是从某人的全名中弄清楚该人的名字并不容易。

您也可以按given_namegiven_name或其他任何内容进行常规搜索或排序。

(请注意,我使用的是given_namefamily_name等,而不是2997227493213602602818、last_name等,因为不同的文化将其名称按不同的顺序排列。)

在一般情况下解决此问题很困难-这是一篇文章,提供了如何解决的难点:在Dublin Core中代表人们的名字。

RichieHindle answered 2020-08-05T00:13:23Z
36 votes

尽可能保持数据干净!

怎么样?

询问您的用户时,仅询问您绝对需要的几件事。

名称的存储方式无关紧要。 重要的是

  1. 用户体验是最好的
  2. 您的系统中没有虚假数据

如果您烦扰用户使用必填字段来填写并再次询问他们几次,他们可能会很烦恼,而不是立即购买您的应用程序。 您想一直避免不良的用户体验。

没有用户关心您在数据库中搜索他的中间名多么容易。 他想拥有轻松,良好的体验,就是这样。

如果用户仅希望使用“只读”帐户而不需要通知时被迫输入诸如邮政地址甚至电子邮件地址之类的数据,该怎么办? 他们将垃圾数据放入您的系统。 无论如何,这将使您的超级搜索和排序算法无用。

因此,我的建议是在任何应用程序中,从用户那里收集尽可能少的信息来为他们提供服务,而不再是更多。

例如,如果您经营一家宠物食品在线商店,请不要在注册时询问您的用户他们拥有哪种宠物。 一旦他们登录并全部满意(新客户),就可以选择填写。 在他们订购实际带到他们家的东西,他们付钱的东西并因此确保您拥有确切的坐标之前,请不要问他们他们的邮政地址。

这将导致更好的数据质量,这是您应该关注的,而不是用户无法从中受益的技术细节。

在您的示例中,我只要求输入全名(虽然不确定),一旦用户愿意订阅您的新闻通讯,就让用户决定如何给他/她发送邮件。

raoulsson answered 2020-08-05T00:12:45Z
17 votes

正如其他人所说,如何将全名分解为其组成部分。

  • 科林·安格斯·麦凯
  • 让·米歇尔·贾尔
  • 文森特 - 梵高
  • 巴勃罗·迭戈·何塞·弗朗西斯科·德·波拉·胡安·内波穆切诺·玛丽亚·德·洛斯·雷梅迪奥斯·西普里亚诺·德拉·圣西西马·特立尼达·鲁伊斯·毕加索

您如何可靠地分解那批东西?

要了解更多信息,请参见程序员对名称的误解。

Colin Mackay answered 2020-08-05T00:14:09Z
13 votes

前几天,我在看西班牙内战,发现大多数规则都没有这个例外:

  • Francisco Paulino HermenegildoTeóduloFranco y Bahamonde,Salgado y Pardo de Andrade
  • 父亲:尼古拉斯·佛朗哥和萨尔加多·阿劳霍
  • 母亲:玛丽亚·德尔·皮拉尔·巴哈蒙德(Maríadel Pilar Bahamonde)和帕多·德·安德拉德(Pardo de Andrade)

下次当我在必须存储名称的系统上工作时,我将尝试一些激进的方法:根据需求进行设计。

我们将使用这些名称做什么?

  1. 邮政地址标签上的名称
  2. 在网站上打招呼
  3. 非正式名称

根据名称的用途,我们将确定要存储的信息量。 也许我们允许用户输入所有这三个信息,包括在第一种情况下的换行符(Generalissimo Franco可能想要列出他的完整头衔和任命,如果他还没死的话)。 也许我们提供“第一”,“中间”,“最后”,“生成”作为选项,其余部分作为默认值填写。 也许我们提供其他常用选项,例如姓,名。

这与自1975年我开始在COBOL中进行编程之前开始使用的老式的“ First,Middle,Last”形成对比,此后就变得“合体”。

John Saunders answered 2020-08-05T00:15:13Z
11 votes

不幸的是,这有点像问什么是在数据库中存储数字的最佳方法。 它取决于您将要使用的功能-有时您需要一个int,有时是一个字节,有时是浮点数。 对于名称,它取决于诸如您希望用户来自什么文化的文化,打算使用这些名称的打算(您将使用这些名称来连接另一个将名称存储为“姓氏,名字”的系统吗? ),以及您有多少钱可以惹恼您的用户。 如果这是内部HR应用程序,您可能会惹恼用户很多,并且对名称成分进行非常结构化的正式分类(有3种以上的方式-不要忘了mr / mrs,jr,III, 多个中间名,带有连字符的姓氏,如果您尝试处理来自所有区域的名称,谁又知道呢?如果您有一个Web应用程序,用户可能会或可能不会在乎,则不能要求他们太在意。

Peter Recore answered 2020-08-05T00:15:35Z
7 votes

您可能需要在3个单独的字段中搜索一个字段,并以便宜的价格连接全名。

例如 如果您要搜索所有的诺兰先生,您的查询将是

SELECT Title+' '+FirstName+' '+Surname As FullName  
from table where firstname = 'Mr' and surname ='Nolan'

仅用全名来做到这一点将是一件痛苦的事情。

Johnno Nolan answered 2020-08-05T00:16:04Z
4 votes

将字段分隔开可以使您支持姓氏首写的不同输出格式和区域性

Ken Keenan answered 2020-08-05T00:16:24Z
4 votes

将名称拆分为多个字段时,可能会发生诸如ORDER BY firstnameORDER BY lastname之类的事情。

将所有名称混入一个字段时,操作起来并不容易。

bobobobo answered 2020-08-05T00:16:48Z
4 votes

我是英语,只有一个名字。 我通常将其放在“姓氏”字段中,以尽量避免恶化。 我通常也被迫在“名字”字段中输入内容,这在定义上是错误的。

至少在某些时候,任何强加“名称”以外的内容的尝试注定都是错误的,有时会使用户感到沮丧。 单名在印度南部,印度尼西亚和巴基斯坦(有数亿人口)以及像我一样在英国的职业怪人中很常见。

``第一,中间,最后''是非常以美国为中心的。 很少有其他国家这么想名字。 请停止这样做。

Wookey answered 2020-08-05T00:17:17Z
2 votes

我唯一想到的就是搜索目的。 使用[=]搜索字段要比说[like]好一点。

如果您不需要将名称显示为单独的单词,则使用单个字段。

但是,如果您需要做[亲爱的阿楚先生]之类的事情,那么3场方法也许会更好。

griegs answered 2020-08-05T00:17:46Z
2 votes

在大多数情况下,它都支持书写诸如“某某先生”之类的套用信函,或者支持按姓氏搜索/排序(这很常见)。

考虑到“第一/中间/最后”可能不适用于所有文化,因此可能会有更好的方法。 最好用“非正式名称” /“正式名称” /“合法名称”或类似形式表示。

尽管如此,在这一点上,第一个/中间/最后一个非常普遍,从数据输入的角度来看,这是每个人都期望的。

Chris Arguin answered 2020-08-05T00:18:15Z
2 votes

事情就是这样,甚至没有人能始终做到这一点,数据太多,特殊情况也太多了。 我现在可以将名称更改为20个部分,中间的13个是我的“名字”。 名称的一部分可以包含任意数量的单词,并且名称的一部分可以任意数量。 有些人只有1个名字(没有姓)。 有些人有很多中间名。 有些人的名字或姓氏由几个词组成。 有人首先列出他们的姓氏。 有些人取其中间名。 有些人使用的昵称与他们的名字显然无关。

如果您尝试在软件中猜测这些约定,则会失败。 期。 也许在某些时候,甚至在大部分时间里,它都会变得正确,但这是否值得呢? 我认为您应该将姓名存储为一个字段,并不要通过使用名字来称呼某人来试图变得可爱。 如果您需要有关姓名(例如昵称)的其他信息,请询问用户!

Wedge answered 2020-08-05T00:18:41Z
1 votes

每个单独的名称都是一个原子数据。 如果将它们分别存储,则更容易以不同的格式将它们打印出来,例如Firstname Lastname和Lastname,Firstname。

geofflane answered 2020-08-05T00:19:01Z
1 votes

如果您永远不需要按名字,中间名或姓氏进行排序或搜索,则没有任何好处。

dkretz answered 2020-08-05T00:19:21Z
1 votes

灵活性。

例如如果某人的姓氏是双桶的,没有中间名。

Smalltown2k answered 2020-08-05T00:19:45Z
1 votes

我对其中的一些答案投了赞成票,但是如果您想避免代码中的重复,冗余或混乱的串联,则可以始终使用数据库中的计算列或类中的方法来公开一致地重建的名称。 如果这些串联比较昂贵(因为要打印一百万条语句),则可以使用持久化列。

通常,您将允许用户指定诸如昵称或好记的名字之类的名称,这样您就不会在他们的记录中使用名称来称呼他们,也不会始终将其称为Smith先生。

这完全取决于您的要求。 没有预期的环境,就没有一个好的答案。

Cade Roux answered 2020-08-05T00:20:15Z
1 votes

不确定它的实用性,但是如果文化敏感性在正在开发的应用程序中很重要,则名称可能是一个集合,集合中的每个元素都带有一个值,指示该名称是否为可寻址的“名字” ”或可寻址的“姓氏”,以此类推,以表示“标题”或其他需要识别的内容。 名称ID可以用来标识元素的顺序以重新组成全名。

Lloyd McFarlin answered 2020-08-05T00:20:35Z
1 votes

只需输入两个字段,“全名”和“首选名称”即可。 支持存在的每个名称(只要该语言具有词汇符号...因此,是的,这不包括没有书面形式的语言)。

只要确保以某种unicode格式处理它们,并且应用程序代码正确处理unicode转换即可。

Arafangion answered 2020-08-05T00:21:00Z
0 votes

对我来说,最好存储3个名称,以便以后需要单独的组件时进行显式解析。

answered 2020-08-05T00:21:20Z
0 votes

您不能总是干净可靠地将姓氏与全名分开,因此有充分的理由将其分开,因为您经常需要姓氏。 完成此操作后,有两种常用方法:

  1. first_name和middle_name; 要么
  2. 姓。

(2)可以说是更可取的,因为人们有时拥有比给定名称更多的名字,而(1)在这方面更不灵活。

另外,另一个公共字段是preferred_name(除了上述字段之外)。

cletus answered 2020-08-05T00:21:57Z
0 votes

无论哪种方式,i18n问题都可能成为麻烦。 某些文化首先使用姓氏,最后使用姓氏,这引起了姓氏和名字的念头,因此我们转到姓氏和姓氏字段。 请稍等,某些文化地区没有姓氏,或者姓氏已由所命名的性别进行了修改。
我们可以进入部落文化,在成年后改名。 “ Sitting Bull”童年时的名字是“ Jumping Badger”。
这有点混乱,但是我所展示的是您拥有的领域越多,设计就越准确。 至少应有一个not null“给定名称”字段和一个optional“姓”字段绑定到一个整数的PK。 如果遵守上述要求,则可以添加字段而不会出现中断查询的问题。

WolfmanDragon answered 2020-08-05T00:22:27Z
0 votes

一些问题也可以通过存储其他列(如PreferredName)来解决。 我们在数据库中执行此操作,还存储了前缀列和后缀列。例如“ Henry W Jones Jnr教授”,首选名称为“ Indiana Jones”。

softveda answered 2020-08-05T00:22:47Z
translate from https://stackoverflow.com:/questions/1122328/first-name-middle-name-last-name-why-not-full-name