我有一个约38列的桌子。
ID
,name
和其他36位是用户的位大小设置。
其他36个列分为6个“设置”,例如Setting1_on
,Setting1_colored
等
这是最好的方法吗?
感谢。
答案 0 :(得分:4)
如果它必须在一个表中并且它们都是切换类型设置,如是/否,真/假等...使用TINYINT来节省空间。
我建议创建一个单独的表'settings',每个选项有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;
答案 1 :(得分:1)
全部取决于您希望如何访问它们。如果您想(或必须)只选择其中一个,那么请使用@Ray解决方案。如果它们可以在功能上分组(实际上,不是所有以F开头的那些假装分组),即。对于一个函数,你总是需要它们的数量,并且读取和写入它们作为一个单独的标志没有意义,然后将它们存储为int并在它们上使用逻辑操作符可能是一个观众。
这样说,除非你在会话期间对数据库进行大量的读写操作,否则将它们捆绑到int中会给你很少的性能,如果所有选项都必须在数据库上节省一些空间存在。如果不存在=假,则可能是折腾。
所有事情都是不平等的,我会和雷先生一起去。
答案 2 :(得分:0)
MySQL有一个SET
类型,在这里很有用。一切都适合单个SET,但六个SET可能更有意义。