我目前有这样的模式:
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非常简单,执行起来也非常快。
谢谢
发布于 2011-10-25 02:27:29
就我个人而言,我认为应该使用int数据类型,该数据的枚举应该在另一个层中完成。
表定义不适合存储枚举值的范围。这很难实现,并且赋予应用程序修改表定义的权力(可能)是一个安全问题。
相反,我建议使用INT类型,然后在您的软件中,创建一个与下面的数据库交互的模型,以提供ENUM的外观。
使用这种设计选择,切换数据库软件很简单,不需要向生产应用程序授予"ALTER TABLE“特权,扩展枚举也很容易。此外,您还减少了程序需要从ENUM整数转换的次数--可以在编译时转换,而不是每次数据库->请求时转换。
发布于 2011-10-25 01:52:46
1)是的,它会更快,因为ENUM数据类型在表本身中被索引(即,不需要为每条记录读取另一个表)
2)可以,只要您不想在任何其他表中使用这些字段。一旦要在多个表中使用给定字段,就应该为该字段创建单独的查阅表格。此外,如果希望该字段具有用户可定义的值(并且不要求它们直接修改数据库来更改它们),则应使用单独的表。
https://stackoverflow.com/questions/7879540
复制相似问题