我有大约 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 开头的人进行一些假装分组),即。您将始终需要它们的数量来实现功能,并且读取和写入它们作为单独的标志没有意义,那么也许将它们存储为整数并在它们上使用逻辑操作符可能会很容易。
话虽如此,除非您在会话期间对数据库进行大量读取和写入,否则将它们捆绑到整数中只会给您带来很少的性能,如果所有选项都必须存在,它将在数据库上节省一些空间。如果不存在 = false,则可能是一个折腾。
所以所有事情都是不平等的,我会和雷先生一起去。
MySQL 有一种SET
在这里可能有用的类型。一切都可以放在一个 SET 中,但六个 SET 可能更有意义。