我正在构建一个简单的工作板(使用 MS SQL/ASP.NET core/C#)并且对数据库设计有疑问。我不知道在某些情况下如何决定是否应该创建一个单独的表。
我有下表:
- 工作
- 类别
- 行业
- 地区
在 Job 表中,我将薪水存储在“Salary”字段中,但我还需要存储“SalaryPeriod”,即支付薪水的频率:每年、每月、每周、每天或每小时。
1) 创建一个包含 5 个选项(每年、每月等)的 SalaryPeriod 表更好,还是 2) 将工资期作为字符串存储在 Job 表中更好?
我倾向于#1,因为:
- 维护数据更容易,例如,如果我需要编辑或添加工资类型(老实说,我不认为我会修改选项,但你永远不会知道)
- 我没有性能问题
我会为它添加一个 int 值作为 PK 的表,这样您就不会多次重复字符串值。
这样可以节省空间。
在相关表中搜索也会更快,因为搜索 int 值比搜索字符串值更快。
由于您有一份系统可接受的工资频率的明确列表,因此它们应该是它们自己的表,即 SalaryPeriod。该表将对频率有唯一约束,因此其中只有一行的值为“每日”,一行为“每小时”等。
作业将此表作为外键引用。就像是
通过这种方式,您可以确保每项工作的价值只能来自最终列表。避免了拼写错误,人们不能随心所欲地发明新的价值观。
如果有一个 UI SalaryPeriod 用于填充下拉菜单和类似的小部件。
SQL Server 受益于表上的小键。所以人们经常添加整数代理键列。然后将这些引用为外键而不是自然键。在这种情况下,一个 tinyint 可能就足够了。
当然,Job 中的列和外键定义改为引用此 id。