在数据库中存储未知数量记录的最有效方法是什么?

时间:2011-10-27 19:32:35

标签: database-design relational-database

如果我事先不知道我可能拥有多少数据,那么存储数据的最佳方法是什么?

申请表是我想跟踪一群人的工作经历,但我不知道每个人工作的地方有多少。是否最好只为适当的最大工作量提供适当的空间或以其他方式存储它?

我考虑将作业存储在另一个表格中,如this;那会是理想的吗?

4 个答案:

答案 0 :(得分:1)

是的,这是行动中的“第一范式”

你有一个人员表

  • 是PersonID
  • 名字
  • ..

和工作表

  • PersonID(FK,PK)
  • JobStartDate(PK)
  • JobFinishDate
  • 标题
  • 薪酬
  • ...

查看free data models here获取灵感

答案 1 :(得分:0)

这听起来像是典型的1对N关系。

您有一个名为“Employees”的表,以及一个名为“Jobs”的表。

您的工作表如下所示:

| id | employee_id | job_title | job_infos... | current_flag | start_date | end_date |

答案 2 :(得分:0)

  

最好是为任意人提供适当的空间   最多的工作

是。始终尽量避免在架构中构建任意限制。远离这类事情:

create table employee
(
    id int primary key,
    name text,
    job1_employer text,
    job1_position text,
    job2_employer text,
    job2_position text
);

而是做这样的事情:

create table employee
(
    id int primary key,
    name text,
    ...
);

create table job_history
(
    id int primary key,
    employee_id int references employee,
    employer text,
    position text,
    ...
);

所以,每个员工都有一行,每个员工过去的工作都有一行。

答案 3 :(得分:0)

CREATE TABLE `employee` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8


CREATE TABLE `employment_history` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `employee_id` int(11) unsigned NOT NULL,
  `name` varchar(255) NOT NULL,
  `start_date` date NOT NULL,
  `end_date` date DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

您可能希望在employment_history.employee_id和employee.id之间添加一个foriegn键。

此结构允许您为给定员工添加尽可能多的历史记录,而无需对数据进行非规范化。如果您关心雇主,您可能还会发现employment_history.name将被jobs_history.employer_id替换为相应的雇主表设置。这将让您了解公司过去和现在的员工人数。