我有一个表有~38列。
ID
、name
和其他 36 个是用户的位大小设置。
其他 36 列分为 6 个"设置",例如 Setting1_on
、Setting1_colored
等。
这是最好的方法吗?
谢谢。
如果它必须在一个表中,并且它们都是切换类型设置,如是/否、真/假等......使用 TINYINT 节省空间。
我建议创建一个单独的表"设置",每个选项有 36 条记录。然后创建一个指向用户表的链接表,其中包含一个值列来记录用户设置。 这将为用户设置创建多对多链接。 它还可以轻松添加新设置 - 只需在"设置"表中添加新行即可。下面是一个示例架构。 我使用 varchar 作为设置的值,以允许以后的设置可能不是位,但如果大小有问题,请随意使用 TINYINT。 此解决方案不会使用与一个表一样多的空间,并且存在大量稀疏填充的列的危险。
CREATE TABLE `user` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(64) DEFAULT NULL,
`address` varchar(64) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `setting` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(64) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `setting_user` (
`user_id` int(11) NOT NULL DEFAULT '0',
`setting_id` int(11) unsigned NOT NULL,
`value` varchar(32) DEFAULT NULL,
PRIMARY KEY (`user_id`,`setting_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
一切都取决于您希望如何访问它们。如果您想(或必须)选择其中之一,请使用@Ray解决方案。如果它们可以在功能上分组(实际上,不是所有以 F 开头的那些假装分组),即。对于一个函数,你总是需要它们的数量,读取和写入它们作为一个单独的标志是没有意义的,那么也许将它们存储为整数并在它们上使用逻辑操作程序可能是一个去。
也就是说,除非您在会话期间对数据库进行大量读取和写入,否则将它们捆绑到 ints 中只会给您带来很少的性能,如果所有选项都必须存在,它将在 DB 上节省一些空间。如果不存在 = 假,这可能是一个折腾。
所以在所有事情都不平等的情况下,我会和雷先生一起去。
MySQL有一个SET
类型,在这里可能很有用。 所有内容都适合单个 SET,但六个 SIT 可能更有意义。
http://dev.mysql.com/doc/refman/5.5/en/set.html