如何为用户个人资料页面设计数据库模式
How do you design a database schema for a user profile page
正在尝试为求职网站设置用户个人资料页面。我打算使用的数据库是MySQL数据库。
通过研究一些数据库设计,我想到了这个模式。
一、用户管理tables
CREATE TABLE `user` (
`user_id` int(11) NOT NULL,
`firstname` varchar(32) NOT NULL,
`lastname` varchar(32) NOT NULL,
`email` varchar(96) NOT NULL,
`mobile_number` varchar(32) NOT NULL,
`password` varchar(40) NOT NULL,
`salt` varchar(9) NOT NULL,
`address_id` int(11) NOT NULL DEFAULT '0',
`ip` varchar(40) NOT NULL,
`status` tinyint(1) NOT NULL,
`approved` tinyint(1) NOT NULL,
`registration_date` datetime NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE `user_address` (
`user_id` int(11) NOT NULL,
`city` varchar(128) NOT NULL
`work_city` varchar(128) NOT NULL,
`postal_code` varchar(10) NOT NULL,
`country_id` int(11) NOT NULL DEFAULT '0'
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE `user_description` (
`user_id` int(11) NOT NULL,
`description` text NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
然后是学历table和工作经验
CREATE TABLE `education_detail` (
`user_id` int(11) NOT NULL,
`certificate_degree_name` varchar(255) DEFAULT NULL,
`major` varchar(255) DEFAULT NULL,
`institute_university_name` varchar(255) DEFAULT NULL,
`start_date` date NOT NULL DEFAULT '0000-00-00',
`completion_date` date NOT NULL DEFAULT '0000-00-00'
)
CREATE TABLE `experience_detail` (
`user_id` int(11) NOT NULL,
`is_current_job` int(2) DEFAULT NULL,
`start_date` date NOT NULL DEFAULT '0000-00-00',
`end_date` date NOT NULL DEFAULT '0000-00-00',
`job_title` varchar(255) DEFAULT NULL,
`company_name` varchar(255) DEFAULT NULL,
`job_location_city` varchar(255) DEFAULT NULL,
`job_location_state` varchar(255) DEFAULT NULL,
`job_location_country` varchar(255) DEFAULT NULL,
`job_description` varchar(255) DEFAULT NULL
)
请注意 user_id 在 table user_address、user_description、education_detail 和 experience_detail 是将它引用给 table 用户的外键。
还有一些 table 我计划使用 user_id 作为 FK 的技能、认证等。
我的问题是,这个数据库设计够好吗?你能建议我应该做些什么来使设计更好吗?
请记住,并非所有人都有工作经验,有些人可能是应届生。
使用 InnoDB,而不是 MyISAM。 (有很多问答解释'why'。)
NULL
或空字符串对于缺失的 description
完全没问题。你还有什么理由不喜欢这样吗? (同时,InnoDB 在处理可选的大字符串时效率更高。)
每个table应该有一个PRIMARY KEY
;你好像没有第一个table大概需要user_id
作为PK。了解 AUTO_INCREMENT
。
和description
一样,为什么address
在一个单独的table中?
我可以为国家 name/code/id 推荐这个吗:
country_code CHAR(2) CHARACTER SET ascii
教育是1:many来自用户,所以user_id
不能PK。工作也是如此。
正在尝试为求职网站设置用户个人资料页面。我打算使用的数据库是MySQL数据库。
通过研究一些数据库设计,我想到了这个模式。
一、用户管理tables
CREATE TABLE `user` (
`user_id` int(11) NOT NULL,
`firstname` varchar(32) NOT NULL,
`lastname` varchar(32) NOT NULL,
`email` varchar(96) NOT NULL,
`mobile_number` varchar(32) NOT NULL,
`password` varchar(40) NOT NULL,
`salt` varchar(9) NOT NULL,
`address_id` int(11) NOT NULL DEFAULT '0',
`ip` varchar(40) NOT NULL,
`status` tinyint(1) NOT NULL,
`approved` tinyint(1) NOT NULL,
`registration_date` datetime NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE `user_address` (
`user_id` int(11) NOT NULL,
`city` varchar(128) NOT NULL
`work_city` varchar(128) NOT NULL,
`postal_code` varchar(10) NOT NULL,
`country_id` int(11) NOT NULL DEFAULT '0'
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE `user_description` (
`user_id` int(11) NOT NULL,
`description` text NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
然后是学历table和工作经验
CREATE TABLE `education_detail` (
`user_id` int(11) NOT NULL,
`certificate_degree_name` varchar(255) DEFAULT NULL,
`major` varchar(255) DEFAULT NULL,
`institute_university_name` varchar(255) DEFAULT NULL,
`start_date` date NOT NULL DEFAULT '0000-00-00',
`completion_date` date NOT NULL DEFAULT '0000-00-00'
)
CREATE TABLE `experience_detail` (
`user_id` int(11) NOT NULL,
`is_current_job` int(2) DEFAULT NULL,
`start_date` date NOT NULL DEFAULT '0000-00-00',
`end_date` date NOT NULL DEFAULT '0000-00-00',
`job_title` varchar(255) DEFAULT NULL,
`company_name` varchar(255) DEFAULT NULL,
`job_location_city` varchar(255) DEFAULT NULL,
`job_location_state` varchar(255) DEFAULT NULL,
`job_location_country` varchar(255) DEFAULT NULL,
`job_description` varchar(255) DEFAULT NULL
)
请注意 user_id 在 table user_address、user_description、education_detail 和 experience_detail 是将它引用给 table 用户的外键。
还有一些 table 我计划使用 user_id 作为 FK 的技能、认证等。
我的问题是,这个数据库设计够好吗?你能建议我应该做些什么来使设计更好吗?
请记住,并非所有人都有工作经验,有些人可能是应届生。
使用 InnoDB,而不是 MyISAM。 (有很多问答解释'why'。)
NULL
或空字符串对于缺失的 description
完全没问题。你还有什么理由不喜欢这样吗? (同时,InnoDB 在处理可选的大字符串时效率更高。)
每个table应该有一个PRIMARY KEY
;你好像没有第一个table大概需要user_id
作为PK。了解 AUTO_INCREMENT
。
和description
一样,为什么address
在一个单独的table中?
我可以为国家 name/code/id 推荐这个吗:
country_code CHAR(2) CHARACTER SET ascii
教育是1:many来自用户,所以user_id
不能PK。工作也是如此。