在数据库中存储人员数据(名字,姓氏)的最佳方式

时间:2015-02-26 13:34:28

标签: sql database normalization

我只是想知道在将人名存储在数据库中时更推荐哪一个。

第一个是,我有表,有两个专用列,例如:FamilyName,GivenName,它们都是字符串类型,我们存储姓氏(或者如果有多个姓氏,则存储)用给定的名字。 这将最终得到像

这样的结构
+-------------------------------+
|              PERSON           |
+-------------+------------+----+
| FamilyName  | Given Name | ID |
+-------------+------------+----+
| Doe         | John       |  1 |
| Doe         | Peter      |  2 |
| Williamson  | Williams   |  3 |
| Hansen      | Williams   |  4 |
+-------------+------------+----+

或者另一种方法是我有一个单独的表,我只存储名称,在名称表中我有对该表的外键引用,我有一个更复杂的关系人表,如下所示:

+-----------------+
| NAME_STRINGS    |
+---+-------------+
|ID | VALUE       |
+---+-------------+
| 1 | Doe         |
| 2 | John        |
| 3 | Hansen      |
| 4 | Peter       |
| 5 | Williamson  |
| 6 | Williams    |
+---+-------------+

+-------------------------------+
|              PERSON           |
+-------------+------------+----+
|FamilyNameId | GivenNameId| ID |
+-------------+------------+----+
| 1           | 2          |  1 |
| 1           | 4          |  2 |
| 5           | 6          |  3 |
| 3           | 6          |  4 |
+-------------+------------+----+

请注意,我不考虑复杂的案例,例如双重,三重或中间名称,我对消除数据重复的概念更感兴趣。对于一个拥有大约10 000 000名独特人士的数据库而言,是否值得为这样的解决方案过度复杂化,但是有很多共同的名字?

2 个答案:

答案 0 :(得分:1)

答案取决于你的情况但是如果你不打算在你的表中存储关于特定名称的更多数据(什么是拉丁语版本,名称的历史等等)那么你肯定会选择一个包含firstnamelastname列的表格。

从标准化的角度来看,如果firstnamelastname依赖于除此人的id以外的任何其他因素,则会有意义。实际上,您无法通过查看他/她的addressposition或数据库中存储的任何其他数据来告诉人名。你也不能通过查看他的lastname或反之亦然来告诉他firstname。你只能说他的名字在功能上取决于他唯一的个人id

如果你的name_info字段的信息类似于“John是从latin Johannes派生的”,那么重复数据库中每个John的信息是没有意义的,因此它应该被移动到另一个表。

答案 1 :(得分:0)

data normalization的深度取决于许多因素。在这种情况下,我建议不做任何改变。假设John Doe有数百个。我认为您需要获得另一个能够正确识别每个属性的属性,例如:个人ID。

有关详细信息,请参阅:
Description of the database normalization basics
Introduction to Data Normalization: A Database "Best" Practice
Normalization of Database