如何在不诉诸“头衔,名字,姓氏”字段的情况下记录一个人的姓名?

时间:2011-08-22 10:21:34

标签: design-patterns database-design web-applications architecture

对于我们的应用程序,它有一个网站和一个后端,我们真的喜欢为人们捕获“全名”的概念,以允许表达某人姓名的许多不同方式。然而;

  • 支付服务提供商想要“所有名字,姓氏” 是必须的卡支付
  • 时事通讯的人想要一个单一的“名字”,这样可以看出公司更“个性化”
  • 人们希望能够按“姓氏”排序的帐户
  • 我们的程序员已注意到我们数据库中的以下客户端:
    • SimonMária--她的“名字”是Mária,她的“姓”是Simon
    • Danesh - 只有一个名字(虽然我认为它与不同的字符集不同!)
    • 陈心兰 - 不确定哪个是姓或姓(据推测,如果被迫这样做,这个客户会用罗马字符集写成)

这使得必须分别捕获某人姓名的每个元素,并以某种方式使名称不符合“标题,名字,姓氏”模式的名称。

因此,如果没有“Right Hon.Chev.John Barrington Smythe Doe III OBE LLD MEng”的每个部分的字段,或者只有一个字段可能只输入“John”,那么如何构建应用程序和数据库练习,以免你以后被抓到?

我已经查看了SO帖子,例如: First name, middle name, last name. Why not Full Name?Person name structure in separate database table但是还没有看到任何关于人们如何在现实世界中实施最佳实践方法(捕获“full_name”)的例子,而这些系统可能不是当前或最佳实践的其他系统...... < / p>

谢谢!

已编辑 - 为清晰起见

3 个答案:

答案 0 :(得分:1)

首先,我们需要将“演示”和“存储”之间的问题分开。您提供的3个示例都是演示问题,可以通过在“title,firstname,lastname”字段中存储名称来轻松处理。

捕获数据最明确的方法是为名称的每个部分提供一个包含显式字段的表单。不同国家对人们如何输入名称有不同的约定 - 例如,欧洲大陆的大多数人使用“LASTNAME,firstname”作为填写表格的惯例。您可以通过为每个名称部分提供明确的表单字段来避免混淆。

我看到存储实现的最灵活方式是使用“名称部分”的概念,并在子表中存储名称部分。 您可能想要为“已知”添加名称部分。 例如:

table People
Person_ID    d.o.b
1            1 Jan 1988
2            3 Feb 1989
3            11 Oct 2001

table NameParts
namepart_ID     description
1              Title
2              FirstName
3              Lastname
4              Suffix

table Person_Name
person_id    namepart_id      value
1            1                Right Hon.
1            1                Chev.
1            2                John 
1            2                Barrington
1            3                Smythe-Doe
1            4                III 
1            4                OBE 
1            4                LLD 
1            4                MEng
2            2                Joe
2            3                Blob
3            1                Ms
3            2                Mary
3            3                Hinge

答案 1 :(得分:1)

我最好的回答来自一个类似的问题:

Personal names in a global application: What to store

Pontus的答案链接到一个文档,该文档没有具体描述如何在数据库中记录名称,但它确实提供了迄今为止最完整的问题描述:

http://ns.hr-xml.org/2_5/HR-XML-2_5/CPO/PersonName.html

也许如果有人有任何坚持这个的数据库实现经验,那么随意添加另一个答案!

答案 2 :(得分:0)

看起来你肯定必须拥有'title','first_name'和'surname'字段。

然后最好有一个像'full_formal_name'这样的第四个字段 这取决于您想要使用的名称,以及您希望使用您的网站的人。

可能值得拥有几个领域, 标题,名字,中间名,姓氏,资格(或任何你想称之为的名字,这也可以代表世代名称,即III)

第二种方式您需要更多字段,但您的用户无需为其全名重新输入数据。