我不确定这个例子的最佳路线:
保存工作信息的表格;工资,就业日期等。我想知道最好的存储方式是'job_title'。
1。我应该有一个2表,job和job_title,作业表引用job_title表的名称。
2。我应该有2个表,job和job_title但是将title作为直接值存储在job中,job_title只是存储所有预先存在的值的列表(有点多余)?
3。或者我不应该在所有/其他建议中使用参考表。
在这种情况下,您对设计的选择是什么?在一对多设计中它会如何变化?
这是一个例子,实际设计要大得多,但我认为这很好地传达了这个问题。
更新,澄清:
用户(外部问题范围)有很多工作,一个工作(开始/结束日期,{职称})有一个标题,标题(名称(即'Web Developer')
答案 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是最佳设计选择。沿着这些行创建两个表:
PK应该有聚簇索引; jobs.title_id和job_titles应该有非聚簇或二级索引; job_titles.title应该有一个唯一的约束。
此关系可以建模为1对1或1对多(一个标题,多个作业)。要强制执行一对一建模,请对jobs.title_id应用唯一约束。但是,你应该不将其建模为1对1的关系,因为它不是。你甚至自己这么说:“DB中的多个工作将使用相同的工作头衔”和“单个工作只有一个工作头衔。”作业表中的条目表示特定用户在特定时间段内持有的某个位置。因为这是1对多关系,所以单独的表是建模数据的正确方法。
这是一个简单的例子,说明为什么会这样。您的公司只有一名CEO,但如果当前的董事会下台且董事会任命一名新董事会会怎样?即使只有一个CEO“职位”且两个用户的工作日期范围不重叠,您将在工作中有两个参考相同标题的条目。如果您强制实施一对一关系,则无法对此数据进行建模。
为什么这些特定的索引和约束?
说明:
职位名称将用作自动填写字段的一部分,因此我将使用查询来获取结果。
正如我之前提到的,在这里使用键值对。在应用程序中将它们的列表提取到内存中,然后查询该列表以获取自动完成值。然后将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版本不支持,只需使用数字索引对其进行编码,并将其解析为查询中的可读形式。