【问题标题】:How do you design a database schema for a user profile page您如何为用户个人资料页面设计数据库架构
【发布时间】:2019-05-24 16:53:58
【问题描述】:

尝试为工作网站设置用户个人资料页面。我打算使用的数据库是 MySQL 数据库。

研究了一些数据库设计,我想出了这个架构。

一、用户管理表

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;

然后是学历和工作经历

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_address、user_description、education_detailexperience_detail 中的 user_id 是一个外键,将其引用到表 user。

我计划将 user_id 用作 FK。

我的问题,这个数据库设计是否足够好?你能建议我做些什么来使设计更好吗?

请记住,并非所有人都有工作经验,有些人可能是新人。

【问题讨论】:

  • 为什么描述在自己的表中?我可以看到,一个用户可以有多个地址、学位和以前的工作,所以把它放在额外的表中是有意义的(很多)。但是对于描述,我认为没有必要(尽管并非完全错误)。我宁愿考虑为电子邮件和电话号码设置单独的表格,因为每个用户也可能不止一个表格。
  • @stickybit,我选择使用不同的表格进行描述,因为那里有懒惰的用户,我相信没有多少人愿意描述自己。我试图在我的数据库中没有空列。也许我错了,这就是我寻求帮助的原因。

标签: mysql database-design relational-database


【解决方案1】:

使用 InnoDB,而不是 MyISAM。 (有很多问答解释“为什么”。)

NULL 或空字符串对于缺少的description 来说是完全可以的。你有什么不喜欢这样的进一步论据吗? (同时,InnoDB 在处理可选的大字符串方面效率更高。)

每个表都应该有一个PRIMARY KEY;你好像没有。第一个表可能需要user_id 作为PK。阅读AUTO_INCREMENT

description 一样,为什么address 在单独的表中?

我可以建议这个国家名称/代码/ID:

country_code CHAR(2) CHARACTER SET ascii

教育是来自用户的1:many,所以user_id不能是PK。工作也是如此。

【讨论】:

  • 嗨,我正在涂鸦并建立一个数据库,看看它应该是什么样子。我的本地 MySQL 一团糟,引擎设置为 MyISAM。我不打算使用 MyISAM,而是使用 InnoDB。谢谢你指出。关于描述,如前所述,我不想要一个空单元格,但正如你所说,这很好,所以我计划不使用不同的表格来描述(关于我)。在用户拥有多个邮政地址之前,考虑不同表中的地址几乎没有任何意义,谢谢您的指出。教育中的 user_id 应该是 FK 而不是 PK。
  • @DakshB - 如果用户可以拥有多个地址,则地址表需要分开并在其中包含user_id。这样,关系将是 1:many(1 个用户与多个地址)。
猜你喜欢
  • 1970-01-01
  • 2011-06-21
  • 2011-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-23
  • 1970-01-01
相关资源
最近更新 更多