我希望以尽可能少的(大小/性能)成本将用户的性别存储在数据库中.

到目前为止,我想到了三个场景

  1. Int - aligned with Enum in code (1 = Male, 2 = Female, 3 = ...)
  2. char(1) - Store 101, 102 or another single character identifier
  3. Bit (boolean) - is there an appropriate field name for this option?

我问这个问题的原因是因为这个answer提到charsbooleanssmaller.

我应该澄清一下,我使用的是MS SQL 2008,它实际上有位数据类型.

推荐答案

我把这个专栏叫做"性别".

Data Type   Bytes Taken          Number/Range of Values
------------------------------------------------
TinyINT     1                    255 (zero to 255)
INT         4            -       2,147,483,648 to 2,147,483,647
BIT         1 (2 if 9+ columns)  2 (0 and 1)
CHAR(1)     1                    26 if case insensitive, 52 otherwise

可以排除BIT数据类型,因为它只支持两种可能的性别,这是不够的.INT支持两个以上的选项,但需要4个字节——数据类型越小/越窄,性能越好.

CHAR(1)TinyINT有优势——两者的字节数相同,但CHAR提供的值更窄.使用CHAR(1)将使使用"m"、"f"等自然键,而不是使用被称为代理/人工键的数字数据.如果需要移植,任何数据库上都支持CHAR(1).

结论

我会使用选项2:CHAR(1).

补遗

"性别"列上的索引可能会有帮助,因为"低基数"列上的索引没有值.也就是说,索引的值没有足够的多样性来提供任何值.

Sql相关问答推荐

根据另一列的值添加另一列的给定值

SQL从同一表连接列

帮助修复查询以识别SQL DW中数据中的递归关系

如何查询一个名称是根据PL/pgSQL函数结果构建的表?

为表中每个缺少的引用创建新行

检索上一个星期四和上一个星期三

对于多字节字符,SQL Server中的DATALENGTH返回1字节

其中使用表名作为;行值;记录?

在SQL中转换差异表的多列

如何在android房间中进行多个加入

根据标识符将两行合并为一行

如何根据 SQL 中的阈值标记一个集群中的所有值?

列(值不为空)到其他有序列

如何在 JSONB 数组的每个对象中添加新的键值对- PostgreSQL

Snowflake中的动态SQL优化

Oracle函数中无法动态迭代创建的SYS_REFCURSOR

postgres按组消除分区中的NULLS

Oracle SQL 从多个条件中 Select 但具有相同的 id

如何更改 duckdb R 中的数据约束

如何使用 pg-promise 创建要在复杂的 sql 查询中使用的 VALUES 列表?