将新表用于性别或将其添加为人员表中的字段

时间:2013-09-22 08:15:43

标签: mysql sql

所以基本上哪个在性能和空间方面更好:

idPerson  Name  Gender   Age
1         John  Male    19
2         Anna  Female  22

或者这样:

idPerson  Name  Age  idGender
1         John  19   1
2         Anna  22   2

idGender  Gender
1        Male
2        Female

我认为第二个更好,因为重复男性/女性每次都会消耗更多空间,但我认为它可能会导致关系变慢。我错了?有更好的方法吗?

4 个答案:

答案 0 :(得分:2)

  

在性能和空间方面更好

计算机科学中的大多数决策通常都是时间和空间之间的权衡。

在您的情况下,第一个解决方案(在表中存储最多6个字符的字符串)最终将使用更多空间,但会导致该字符串直接可用于表上的查询;而第二个解决方案(存储一个整数表示,其含义可以在第二个表中查找)将使用更少的空间,但需要更多的工作来发现字符串(尽管它确实能够通过定义{{3}来限制可能的值})。

另一种方法可能是使用MySQL的foreign key constraint类型,这使您可以使用字符串,同时有效地仅存储“引擎盖下”的整数。在决定采取这一行动之前,您可能希望考虑Chris Komlenic的文章ENUM

答案 1 :(得分:1)

假设性别为二元字段,我会选择第三个选项:为列MALE命名,有效值为YN(或{{1} } / 1

需要考虑的事项:其他性别如变性人;)

答案 2 :(得分:1)

最佳解决方案可能是两者的组合,您在Person表中使用单个字符列来表示您在应用程序中映射到的性别代码。

您可以使用“ M ”和“ F ”作为男性和女性的代码,但现在您可以将任何其他代码映射到任何外国性别可能会想到。

答案 3 :(得分:0)

我将采用第一种方法,因为分开并保持性别信息分开是没有多大意义的,因为它不会改变:)。 如果性别名称可以改变,那么我会采取第二种方法。

编辑: 添加此项以响应以下评论。单个表查询速度更快,因为您不需要任何连接,因此性能更佳。我不认为这两种方法在空间方面会有很大不同。