我目前有这个架构:
CREATE TABLE `users` (
`users_id` int(11) NOT NULL AUTO_INCREMENT,
`users_name` varchar(50),
`users_lastname` varchar(50),
`users_dob` date,
`users_type` int(11) NOT NULL default 0,
`users_access` int(11) NOT NULL default 0,
`users_level` int(11) NOT NULL default 0,
/* etc...*/
PRIMARY KEY (`users_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
CREATE TABLE `users_types` (
`types_id` int(11) NOT NULL AUTO_INCREMENT,
`types_name` varchar(50),
PRIMARY KEY (`types_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
/* etc..*/
查询:
SELECT
types_name AS user_type,
/* all other fields*/
users.*
FROM users
INNER JOIN users_types ON (users.users_type=types_id);
/* INNER JOIN for all other tables*/
/* Rest of query */
我的新解决方案:
CREATE TABLE `users` (
`users_id` int(11) NOT NULL AUTO_INCREMENT,
`users_name` varchar(50),
`users_lastname` varchar(50),
`users_dob` date,
`users_type` ENUM('type1', 'type2', 'type3'),
`users_access` ENUM('access1', 'access2', 'access3'),
`users_level` ENUM('level1', 'level2', 'level3'),
/* etc...*/
PRIMARY KEY (`users_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
查询:
SELECT
*
FROM users
据我所知,使用ENUM非常简单,执行起来非常快。
由于
答案 0 :(得分:19)
就个人而言,我认为应该使用int数据类型,并且应该在另一层中完成该数据的ENUM化。
表定义是存储枚举值的不良位置。很难轻松搞定,并且让应用程序能够修改表定义是一个安全问题(可能)。
相反,我建议使用INT类型,然后在您的软件中创建一个与下面的数据库交互的模型,以显示ENUM的外观。
通过这种设计选择,切换数据库软件是微不足道的,您不需要为生产应用程序授予“ALTER TABLE”权限,并且扩展枚举很容易。另外,您正在减少程序从ENUM进行翻译所需的次数 - >整数 - 它可以在编译时完成,而不是每个数据库SQL请求。
答案 1 :(得分:1)
1)是的,它会更快,因为ENUM数据类型在表本身中被索引(即不需要为每个记录读取另一个表)
2)是的,只要您不想在任何其他表中使用这些字段。只要您想在多个表中使用给定字段,就应该为该字段创建单独的查找表。此外,如果您希望该字段具有用户可定义的值(并且不要求它们直接修改数据库以进行更改),则应使用单独的表。