8

在 MY SQL 数据库中存储性别的最佳方法是什么?我对这个问题有点困惑,因为不同的人以不同的方式表达。一些人建议将其存储在INT中更好,但其他人建议将其存储在TINYINTEnum中,但其他一些人建议将其存储在 CHAR(1) M代表男性和F代表女性。

此外,在听到http://en.wikipedia.org/wiki/ISO_5218时,它变得更加可疑

但在我看来,将它存储在 CHAR 中是一个好主意,因为它比 ENUM 提供了更多的健壮性?我也关心可伸缩性,想知道一个更好的解决方案来存储数百万条记录。

非常感谢专家提出的宝贵建议。

4

2 回答 2

10

如果您可能不得不处理更复杂的性别问题(进行中的性别变化或跨性别),最好的方法是使用可能值的参考表:

CREATE TABLE static_gender (
    ID INT AUTO_INCREMENT PRIMARY KEY,
    Name varchar(10),
    Description varchar(100)
) ENGINE=INNODB;

最初,您可以加载它:

INSERT INTO static_gender VALUES
(DEFAULT, 'F', 'female'),
(DEFAULT, 'M', 'male');

这样,您可以在需要新的性别值时扩展表格。在您的 USER(或其他)表中,您static_gender_id使用 JOIN 存储并获取性别的值。

于 2013-06-28T13:59:32.127 回答
5

就个人而言(因为这是一个有点主观的问题)我会选择ENUM. MySQL 不支持CHECK约束,因此这ENUM是真正确保值为Mor F(or mor f) 的唯一方法。对我来说,这是最重要的一点。

此外,ENUM应该只需要一个字节的存储空间(根据文档),所以它在存储方面与CHAR(1)or一样有效TINYINT

我根本不理解这种TINYINT方法,因为您最终会遇到这样的查询:

SELECT * FROM myTable WHERE gender = 1;

1男的还是女的?如果是男性,是女性0吗?或者是2吗?或者也许16?你已经必须记住一堆东西来编写(和维护)一个应用程序;无需添加到那堆。


Ed Gibbs 的附录 2017-12-01:当我在不相关的 Google 搜索中偶然发现它时,重新审视我的答案......

ENUM方法在具有静态、一维值域(例如,Y/N、To/Cc/Bcc)的用例中具有优点,但它不适用于性别。我的回答是在“你如何将一列限制为 M 或 F”的书呆子语境中,而不是在更广泛的性别定义语境中。

D Mac 的解决方案更加健壮和开明,但它仍然不完整,因为它也是单维的,而性别是多维的。

在将人类分类为任何主观类别(性别、种族、阶级认同、宗教、政治派别、就业状况、种族认同、性偏好、爱恋等)时,请考虑他们可能识别自己的多种方式。并不总是有“选中一个框”的解决方案。

这超越了意识形态。试图将多维实体归类为单一维度是不准确的,而且不准确是有代价的。

于 2013-06-20T16:18:00.040 回答