【问题标题】:Database table design with money and periods带有货币和周期的数据库表设计
【发布时间】:2013-05-22 22:36:33
【问题描述】:

假设我有像 Employee 这样的数据库表,并且每个员工都有相关的工资。不同时期的工资可能不同。如何设计一个存储这些工资的表格? (“工资期”不能重叠,但这个约束不必由数据库处理)

Employee 不会是唯一需要这种日期模式货币数据的表。

我正在考虑一个包含两个主键(一个“wageId”整数和一个日期时间)和一个工资列(整数,按照建议计算便士)的表。 Employee(或任何其他)表将有一个引用“wageId”的列“wage”。日期时间将是工资有效的日期。这有任何意义吗?可以改进吗?

我正在使用 mysql。

【问题讨论】:

  • 不要将货币值存储在浮点字段中。你会在某个时候得到不稳定的结果。使用定点格式(例如存储为便士)或“十进制”类型。
  • 谢谢,我会选择“便士”的方法
  • 你有没有想过在货币价值上做一些计算,比如“平均”,你可以得到几分之一美分?我建议增加几个数字以使其单位为百分之一便士。证券交易所就是这样做的。例如 560 便士是 5.60 美元,但请改用 56000。
  • 我会计算工资,但不会计算数据库。感谢您的评论。

标签: mysql sql database


【解决方案1】:

这是一个渐变维度的示例。 Ralph Kimball 的书籍是数据库设计的一个很好的参考。

在任何情况下,您都需要一个名为EmployeeWage 之类的表。这将具有以下列:

  • EmployeeWageId,行的唯一 ID
  • EmployeeId,员工的标识符
  • 工资,工资
  • EffDate,工资生效日期
  • EndDate,工资停止生效的日期。

我还会添加列,例如每行的创建者和确切时间,但这超出了您的问题范围。

【讨论】:

  • 假设员工不能同时获得两份工资,您只需要真正需要工资开始的日期。当另一个工资“接管”时,它会隐含地结束。
  • @MarcB 。 . .设置结束日期可以简化许多查询。通过一个简单的查询,您可以随时找到工资。您可以找到当前工资。结束日期可能看起来多余,但它确实是每条记录的“关键”的一部分,使表格更易于使用。
  • 我想这很好,但我正在考虑一种更通用的方法,让我每次在其他任何地方需要 XyzWage 表时都可以使用它。瞄准这是一件坏事吗?每次需要时我都应该制作新的工资表吗?或者,我可以添加更多 Id,例如“employeeId”,但看起来很奇怪......
  • @user1713059 。 . .我完全不明白你的评论。对于所有员工和所有工资,您将拥有一个 EmployeeWage 表。您需要使用员工 ID 和日期来查询它。您不会创建和删除这样的表,只需在其中插入新行并更新现有行。
  • "Employee 不会是唯一需要这种日期模式货币数据的表。"将有其他对象(表格)需要一种方法来存储随时间变化的货币。抱歉,我想我的解释能力很弱。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-08
  • 1970-01-01
  • 2023-04-04
  • 2018-12-15
  • 2018-06-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多