我正在开发一个约会网站。在这个项目中,我使用了一个名为"users"的mysql表,对于这个表,我对许多列使用了ENUM数据类型。
我的"users"表是这样的:
CREATE TABLE IF NOT EXISTS users (
user_id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
country_id SMALLINT UNSIGNED NOT NULL,
username VARCHAR(20) NOT NULL,
password CHAR(128) NOT NULL,
salt CHAR(128) NOT NULL,
email varchar(40) NOT NULL,
first_name VARCHAR(30) DEFAULT NULL,
last_name VARCHAR(30) DEFAULT NULL,
sex ENUM('Male', 'Female') DEFAULT 'Male',
dob VARCHAR(10) NOT NULL,
mobile VARCHAR(12) DEFAULT NULL,
address VARCHAR(40) DEFAULT NULL,
address_two VARCHAR(40) DEFAULT NULL,
city VARCHAR(25) NOT NULL,
whoami VARCHAR(80) NOT NULL,
looking_for ENUM('Short-term','Long-term','Marriage','Dating','Friends/Hang Out','Intimate Encounter','Talk/Email/Pen Pal','Activity Partner') DEFAULT 'Dating',
ethnicity ENUM('White/Caucasian','Black/African','Hispanic/Latino','Asian','Native American','Middle Eastern','East Indian','Pacific Islander','Mixed Race') DEFAULT NULL,
marital_status ENUM('Never Married','Divorced','Widowed','Separated','In a Relationship','Not Single/Not Looking') DEFAULT NULL,
religion ENUM('Atheist','Buddhist/Taoist','Christian/Catholic','Christian/Protestant','Christian/LDS','Christian/Other','Hindu','Jewish','Muslim/Islamic','New Age','Non-religious','Agnostic','Spiritual but not religious','Other Religion') DEFAULT NULL,
body_type ENUM('Skinny','Slim/Slender','Fit/Athletic','Toned & Firm','Muscular','Ripped','Modelesque','Average','Proportional','Curvy','Few extra pounds','Full Figured','Stocky','Husky','Voluptuous','Big and Beautiful','Large','Disabled') DEFAULT NULL,
hair_color ENUM('Auburn','Red','Stawberry Blonde','Platinum Blonde','Blonde','Dark Blonde','Light Brown','Medium Brown','Dark Brown','Black','Radically Dyed','Salt & Pepper','Partial Gray','Gray','Silver/White','Bald/Shaved') DEFAULT NULL,
drink ENUM('Never','Rarely','Occasionally','Socially','Regularly','Gave it up') DEFAULT NULL,
smoke ENUM('Never','Socially','Regularly','Trying To Quit') DEFAULT NULL,
headline VARCHAR(100) DEFAULT NULL,
about_user TEXT DEFAULT NULL,
ideal_match_info TEXT DEFAULT NULL,
last_login TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00',
date_registered TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (user_id),
UNIQUE (email),
UNIQUE (username)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
我的问题是,我在这个表中使用的ENUM数据类型是否正确。如果这是正确的路,希望有人给我指路。
谢谢。
这不是使用ENUM
的好方法。您很可能不得不更改选项,而更改ENUM的唯一方法是使用代价高昂且容易出错的ALTER TABLE
。我会将选项存储为文本(VARCHAR
或TINYTEXT
)。从规范化的角度来看,最好为选项创建单独的表,但这会使数据更难以理解。
ENUM数据类型最适合用于保证选项不会更改的情况
这是一种非常糟糕的使用enum的方式,因为:
- 没有简单的方法来添加或删除网站的选项。
- 没有简单的方法从网站的代码后面(说PHP代码)获得可能值的列表 当引用枚举值时,在后端代码中很容易出错
- 在数据库代码中也很容易出错。
- 没有简单的方法来实现i18n。
您要查找的是一组具有一对多类型关系的主从表
根据你的代码判断,你会得到更多的表:
looking_for_list (int id, varchar(255) text_en, ... )
ethnicity_list (int id, varchar(255) text_en, ... )
marital_status_list (int id, varchar(255) text_en, ... )
religion_list (int id, varchar(255) text_en, ... )
body_type_list (int id, varchar(255) text_en, ... )
hair_color_list (int id, varchar(255) text_en, ... )
drink_list (int id, varchar(255) text_en, ... )
smoke_list (int id, varchar(255) text_en, ... )