DB设计用于一对一单列表

时间:2015-01-27 13:31:16

标签: mysql sql database

我不确定这个例子的最佳路线:

保存工作信息的表格;工资,就业日期等。我想知道最好的存储方式是'job_title'。

  • 职位名称将用作自动填写字段的一部分 我将使用查询来获取结果。
  • DB中的多个作业将使用相同的职位。
  • 职位名称将成为许多查询的重要组成部分 应用
  • 单个作业只有一个标题。

1。我应该有一个2表,job和job_title,作业表引用job_title表的名称。

2。我应该有2个表,job和job_title但是将title作为直接值存储在job中,job_title只是存储所有预先存在的值的列表(有点多余)?

3。或者我不应该在所有/其他建议中使用参考表。

在这种情况下,您对设计的选择是什么?在一对多设计中它会如何变化?

这是一个例子,实际设计要大得多,但我认为这很好地传达了这个问题。

更新,澄清:

用户(外部问题范围)有很多工作,一个工作(开始/结束日期,{职称})有一个标题,标题(名称(即'Web Developer')

3 个答案:

答案 0 :(得分:1)

编辑:获得澄清后

这样的表就足够了 - 只需在主job_title_id表中添加member列作为外键

---- "job_title" table ---- (store the job_title)
 1. pk - job_title_id
 2. unique - job_title_name <- index this

__原始答案__

您需要澄清job_title代表什么

  • 担任此职位的人?
  • 有这个职位的部门/部门?
  • 某些属性集?像销售总是有佣金
  • 或者只是一串它叫什么?

从我到目前为止阅读的内容来看,你只需要&#34; job_title&#34;作为某种维度 - 为它做id,使字符串可搜索 - 这就是它

例如

---- "employee" table ---- (store employee info)
 1. pk - employee_id
 2. fk - job_title_id
 3. other attribute (contract_start_date, salary, sex, ... so on ...)

---- "job_title" table ---- (store the job_title)
 1. pk - job_title_id
 2. unique - job_title_name <- index this

---- "employee_job_title_history" table ---- (We can check the employee job history here)
 1. pk - employee_id
 2. pk - job_title_id
 3. pk - is_effective
 4. effective_date [edited: this need to be PK too - thanks to KM.]

我仍然认为你需要为我们提供一个用例 - 这将极大地改善我们的理解我相信

答案 1 :(得分:1)

您的选项1是最佳设计选择。沿着这些行创建两个表:

  • jobs(job_id PK,title_id FK not null,start_date,end_date,...)
  • job_titles(title_id PK,title)

PK应该有聚簇索引; jobs.title_id和job_titles应该有非聚簇或二级索引; job_titles.title应该有一个唯一的约束。

此关系可以建模为1对1或1对多(一个标题,多个作业)。要强制执行一对一建模,请对jobs.title_id应用唯一约束。但是,你应该将其建模为1对1的关系,因为它不是。你甚至自己这么说:“DB中的多个工作将使用相同的工作头衔”和“单个工作只有一个工作头衔。”作业表中的条目表示特定用户在特定时间段内持有的某个位置。因为这是1对多关系,所以单独的表是建模数据的正确方法。

这是一个简单的例子,说明为什么会这样。您的公司只有一名CEO,但如果当前的董事会下台且董事会任命一名新董事会会怎样?即使只有一个CEO“职位”且两个用户的工作日期范围不重叠,您将在工作中有两个参考相同标题的条目。如果您强制实施一对一关系,则无法对此数据进行建模。

为什么这些特定的索引和约束?

  • ID列是PK和聚簇索引,原因很明显;你使用这些来加入
  • jobs.title_id是希望明显数据完整性原因的FK
  • jobs.title_id不为null,因为每个作业都应该有一个标题
  • jobs.title_id需要一个索引才能加快连接速度
  • job_titles.title有一个索引,因为你已经表明你将根据这一列进行查询(虽然我不会以这种方式查询,特别是因为你说过会有很多标题;见下文)
  • job_titles.title具有唯一约束,因为没有理由重复使用相同的标题。您可以(并且将)拥有多个具有相同标题的作业,但您在job_titles中不需要两个“CEO”条目。实施此独特性将保留数据完整性,可用于报告目的(例如,根据填写了多少“Web开发人员”作业来绘制IT部门的生产力)

说明:

  

职位名称将用作自动填写字段的一部分,因此我将使用查询来获取结果。

正如我之前提到的,在这里使用键值对。在应用程序中将它们的列表提取到内存中,然后查询该列表以获取自动完成值。然后将ID发送到DB以进行实际的SQL查询。查询将以这种方式表现更好;即使使用索引,搜索整数通常比搜索字符串更快。

You've said that titles will be user created。将一些输入卫生和验证过程放在适当的位置,因为您不需要像“WEB DEVELOPER”,“Web开发人员”,“Web开发人员”等冗余条目。验证应该在应用程序和数据库级别进行;唯一约束是这部分(但全部)。关于单独的计算机和显示列的Prodigitalson's remark与此问题有关。

答案 2 :(得分:0)

如果只有少数固定职位名称,您可能希望在我们的数据库中使用枚举。 见http://dev.mysql.com/doc/refman/5.0/en/enum.html 如果您的mysql版本不支持,只需使用数字索引对其进行编码,并将其解析为查询中的可读形式。