2列中的MySQL名称和姓氏与1列中的名称相对应

时间:2012-10-01 14:46:53

标签: php mysql performance

一个简单的问题,我找不到任何id的答案:

名称应该在2个不同的DB列(名称/姓氏)还是1列(名称+姓氏)中?

在我所有的项目中,他们分为两个不同的栏目,但现在我必须开始一个新的项目,我很想知道如何更好地存储它。我的意思是,两个不同的列给我带来了一些麻烦,有时会降低性能。请注意这一点非常重要:

  • 该网站公共部分的一个非常重要的部分是高级搜索,它将搜索大约200k记录中的全名。

那么,你有什么建议? 2列还是1列?我倾向于使用1列解决方案,因为我在使用2时找不到任何优势,但也许我错了?

修改

感谢您的回答。这个问题的唯一原因是性能问题,我需要得到所有额外的提升。

5 个答案:

答案 0 :(得分:5)

关系数据库的关键是关联数据。如果您在一个字段中存储全名(例如John Smith),则您将无法轻松地分隔名字和姓氏。

如果将它们存储在单独的字段中,您可以非常轻松地将它们重新加入一个完整的名称,但是将一个名称可靠地分成单独的第一个和最后一个名称组件是非常困难的。

答案 1 :(得分:2)

两列更灵活。例如

  • 您是否想要按姓氏排序?
  • 您是否想要正式向该人致辞(例如:亲爱的Cosmin先生)?
  • 您是否想要按姓氏而非姓名搜索,反之亦然?

在任何设计合理的数据库中,200K记录都是微不足道的。

您可能会发现这是一篇关于names

主题的有趣读物

答案 2 :(得分:0)

使用两列,您可以按姓氏排序,而无需在select语句中执行昂贵的子字符串操作。在调用它的情况下,很容易做一个CONCAT来获取全名,但是更难用“John Doe-Smith”或“John Doe III”这样的名字来解析姓氏。

答案 3 :(得分:0)

在我看来,我宁愿将其设计为两个不同的colmns ,因为您可以通过各种方式处理记录。关于性能问题,在两列上添加索引以加快搜索速度。

有时,您希望搜索John Doe并希望即使它是反向Doe John,但仍然与John Doe匹配。这是在名称上使用单独字段的一个优点。

架构的示例设计,

CREATE TABLE PersonList
(
    ID INT AUTO_INCREMENT,
    FirstName VARCHAR(25),
    LastName VARCHAR(25),
    -- other fields here,
    CONSTRAINT tb_pk PRIMARY (ID),
    CONSTRAINT tb_uq UNIQUE (FirstName, LastName)
)

答案 4 :(得分:0)

使用2列可以帮助您:

  • 按姓氏轻松排序数据
  • 按名称与用户沟通(例如,许多网站上使用的“Hello Michael”等)。
  • 在多列中显示大量数据(当屏幕上没有空格时,您只能显示姓氏)

以“姓氏名称”格式存储的名称仍然很容易排序,但在某些国家/地区可能会被视为不优雅。