3

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

name 应该在 2 个不同的 DB 列(name/surname)还是在 1 个列(name + surname)?

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

  • 该站点公共部分的一个非常重要的部分将是高级搜索,它将在大约 20 万条记录中搜索全名。

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

编辑

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

4

5 回答 5

5

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

如果将它们存储在单独的字段中,则可以非常轻松地将它们重新组合成一个全名,但是很难可靠地将名称分开成单独的名字 + 姓氏组件。

于 2012-10-01T14:48:15.240 回答
3

两列更加灵活。例如。

  • 你想按姓氏排序吗?
  • 您是否曾经想正式向该人讲话(例如:亲爱的 Cosmin 先生)?
  • 您是否想按姓氏而不是姓氏进行搜索,反之亦然?

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

您可能会发现这是一本关于名称主题的有趣读物

于 2012-10-01T14:48:11.890 回答
0

使用两列,您可以按姓氏排序,而无需在 select 语句中执行昂贵的子字符串操作。在需要它的情况下,很容易执行 CONCAT 来获取全名,但很难从诸如“John Doe-Smith”或“John Doe III”之类的名称中解析出姓氏。

于 2012-10-01T14:49:12.107 回答
0

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

有时您想要搜索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)
)
于 2012-10-01T14:49:24.927 回答
0

使用 2 列可以帮助您:

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

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

于 2012-10-01T14:52:44.767 回答