1

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

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

4 回答 4

3

在性能和空间方面哪个更好

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

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

另一种方法可能是使用 MySQL 的ENUM类型,它使您能够使用字符串,同时有效地“在后台”仅存储一个整数。在决定采取这种行动之前,您可能希望考虑 Chris Komlenic 的文章8 为什么 MySQL 的 ENUM 数据类型是邪恶的原因。

于 2013-09-22T08:24:04.523 回答
1

假设性别作为二进制字段,我会选择第三种选择:命名列MALE,有效值将是Yor N(or 1/ 0)

需要考虑的事情:其他性别,如跨性别;)

于 2013-09-22T08:22:48.080 回答
1

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

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

于 2013-09-22T08:46:01.660 回答
0

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

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

于 2013-09-22T08:21:51.930 回答