例如,如果我有一个用户表,我想存储性别或性别,我会添加一个像sex
这样的列。
使用整数然后用我最喜欢的编程语言映射它真的值得吗?
赞1 => 'Male'
和2 => 'Female'
有任何表演理由吗?
或者我可以安全地使用varchar, more 与'female'或'male'的含义几乎就像我使用mysql ENUM
一样?
编辑:我在这里和那里有时候会更好,有时候没关系,所以我更多地寻找基准或某种“更好”的答案。
我的意思是我认为使用varchar实际上比整数更有意义,并且只有当性能超过0.3%或者其它时我才会使用整数。
答案 0 :(得分:18)
答案 1 :(得分:7)
Ortiginal答案:
我建议将其存储在CHAR(1)
列M
或F
中
它具有足够的表现力以达到特定目的,并且具有单个字符比较的速度优势
更新4(固定基准):
所有以前的基准测试都存在致命缺陷,其中一个(CHAR(1)
)表格为MyISAM
,其他所有基准为InnoDB
。所以我使用MyISAM
重新创建了包含所有表的数据库,现在结果更有意义。
因为我使用MySQLWorkbench的向导来创建表而忘记更改其他表中的数据库引擎并且默认为InnoDB
(我有MySQL 5.5)
所以更正的结果如下,(我已删除了之前的所有基准,因为它们无效):
// select queries
$query['char'] = "select count(*) from test_table where gender = 'M'";
$query['char_lower'] = "select count(*) from test_table where LOWER(gender) = 'm'";
$query['varchar'] = "select count(*) from test_table_2 where gender = 'Male'";
$query['varchar_lower'] = "select count(*) from test_table_2 where LOWER(gender) = 'male'";
$query['tinyint'] = "select count(*) from test_table_3 where gender = 1";
// benchmark result
array
'char' => float 0.35457420349121
'char_lower' => float 0.44702696800232
'varchar' => float 0.50844311714172
'varchar_lower' => float 0.64412498474121
'tinyint' => float 0.26296806335449
新结论: TINYINT
最快。但我的建议仍然是使用CHAR(1)
,因为未来的开发人员更容易理解数据库。
如果您使用TINYINT
,我的建议是将列命名为ismale
而不是sex
并存储0 => Female
和1 => male
,从而使其成为一点点在原始数据库中更容易理解。
基准的表结构是:
CREATE TABLE `test_table` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`gender` char(1) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM
3个表中只有性别列的类型不同,类型为:
CHAR(1), VARCHAR(6), TINYINT
所有3个表都有10000
个条目。
答案 2 :(得分:3)
如果您正在进行任何SELECTS
,它将比进行字符串比较快得多。
SELECT * FROM User WHERE Gender = 'female'
示例:
说我有female
作为字符串。它长6个字符。因此,它必须对每个记录进行6次比较,并且使用严格的套管 - 对不区分大小写的代价更高。
现在说我有123456
作为int。它的一个值,而不是6个比较,即使人类可读的字符串长度为6个字符。
除了
理想情况下,Male
和Female
将是另一个表,而您的User
表将具有该表的FK。
答案 3 :(得分:3)
存储为varchar
的好处是数据本身可以说明一切 - 然而,它在那里结束并且仅在对原始数据的查询中表现出来,这通常由知道系统的开发人员完成。无论如何(向用户或其他人公开数据查询功能通常会使用应用程序层,这意味着可以根据需要格式化它。)并且这些数据可以显示,但考虑必须不断解析它!
至于存储为整数,它有点混淆,但只要它在数据规范和映射中清楚地列出,那么你就可以在应用程序中更有效地使用数据(使用映射将integer
映射到enum
是一件事情,并在术语或分支逻辑中公开更可用的类型,删除字符串解析。)它也比存储字符串更有效。
当然存在将'选项'存储在专用表中并且其他表字段引用它的路径,但我在许多项目中发现的是,这在使用方面远非理想,除非仍然使用可映射的类型 - 然后该表只会使某些东西更加模糊,可能。
答案 4 :(得分:3)
整数比进行字符串比较快得多,但我认为你更喜欢使用字符“M”或“F”。如果人们转移表,他们就会确切地知道你的意图,并且比维护连接表更好。除非我们很快就会遇到新的性别。
答案 5 :(得分:2)
取决于......但一般都是。
ints在磁盘上占用的空间更少。
整理比较快
ints通过网络更快(更小)
所以,如果它只是一行,而你每天查询一次 - 你永远不会注意到,但总的来说,你会受益。
答案 6 :(得分:2)
这很简单:使用ISO 5218值。为什么重新发明轮子并使您的区域设置特定且不太便携?
因为这组值很小且很稳定,所以你可以使用CHECK
约束...... oops,我的意思是,MySQL用外键创建一个查找表!