MongoDB中仅含两个取值的属性应存为Boolean、Number还是String?
二值属性(仅可取值
yes/no)三种存储方案说明 各存储类型的适用原因
- Boolean类型(
yes映射为true,no映射为false)
这是最贴合二值属性语义的方案,布尔值天生对应“是/非”的二元逻辑,不需要额外做值映射。不管是业务代码写判断逻辑,还是数据库写查询条件,都可以直接用布尔表达式实现,可读性最高。同时数据库层面会自动做类型校验,不会出现除了true/false之外的非法值,数据一致性更有保障,适合对代码可读性、数据校验要求高的通用场景。 - Number类型(
yes映射为1,no映射为0)
适配需要做数值统计的特殊场景,比如统计取值为yes的记录总数时,直接对该字段做sum()求和就能得到结果,不需要额外写case when类的判断语句。另外部分老版本数据库没有原生布尔类型,用TINYINT存0/1是兼容性最高的替代方案,跨数据库迁移的适配成本更低。 - String类型(直接存
"yes"/"no"字符串)
适合需要直接展示原值的业务场景,前端或者报表系统可以直接取字段值输出给用户,不需要额外做true转yes、1转yes的转换逻辑,减少业务层的代码量。另外如果后续该字段的取值有可能扩展(比如新增"pending"这类中间状态),不需要修改字段类型即可完成迭代,改造成本最低。
String类型是否是三者中空间开销最高的
绝大多数场景下确实是。
布尔类型在大部分数据库中仅占用1字节存储空间,部分做了存储优化的数据库甚至可以让多个布尔字段共用1字节的不同位存储,空间占用极低。如果Number类型用TINYINT存储0/1也仅占1字节,哪怕用INT类型存储也只占4字节。而字符串类型存储"yes"/"no"时,本身3个字符就占3字节(UTF8编码下),还要额外存储至少1字节的字符串长度信息,总占用至少4字节,比布尔和TINYINT的1字节高出不少,如果是用定长CHAR类型存储,空间开销还会更高。
内容的提问来源于stack exchange,提问作者Bear Bile Farming is Torture
相关产品推荐
相关产品推荐

