在表格中维护有效记录

时间:2009-02-04 10:16:27

标签: database

我有一张表格可以保存航班时刻表数据。每个时间表都有一个有效的来自&有效日期。我从平面文件加载此表,这不提供有效_从和有效日期。所以在加载时我会向用户询问此信息。

假设用户从日期作为当前日期并且到日期为3月31日。现在3月1日,用户加载新的航班时刻表,用户从日期开始作为当前日期,并将日期定为5月31日。

如果我在3月1日到3月31日之间查询表格生效日期,那么查询会为每个航班返回两条记录,而我希望每条航班只有一条记录,这应该是最新记录。

我该怎么做?我应该通过查询或加载检查并更正数据来处理这个问题吗?

4 个答案:

答案 0 :(得分:0)

您需要识别数据的主键(可能是“业务”键)。必须有一些东西可以唯一地标识每个航班时刻表(听起来它不应该包含effective_from。一旦建立了该密钥,您在导入时检查它,然后更新现有记录或插入新记录。

答案 1 :(得分:0)

我假设每个航班都有一些唯一的ID,否则如何区分它们。然后,您可以添加额外字段“活动”的计划。 在新计划中加载时 - 查询具有相同航班ID的第一个现有记录并将其设置为Active = false。使用Active = true输入新记录。

查询很简单:从调度中选择*,其中active = 1

答案 2 :(得分:0)

我开发了这个解决方案,但如果可能的话,寻找更好的解决方案。

Table Schedule {
scheduleId, flightNumber, effective_from,effective_to
}

Data in Schedule table {
1, XYZ12, 01/01/2009, 31/03/2009
2, ABC12, 01/01/2009, 30/04/2009
}

现在用户加载另一条记录3,XYZ12,01 / 03 / 2009,31 / 05/2009

从Schedule中选择scheduleId,其中flightNumber ='XYZ12'和(effective_from< '01 / 03/2009'和effective_to> '01 / 03/2009'或effective_from< '31 / 05/2009'和effective_to&gt ; '31 / 05/2009')

如果上面的查询返回任何意味着它重叠的结果,我应该向用户抛出错误。

答案 3 :(得分:0)

问题描述和对其中一个建议的评论给出了业务规则:

  • 查询生效日期的航班每次航班只能返回一条记录
  • 返回的记录应为最新记录
  • 以前的时间表必须保存在表格中

答案的关键是如何确定哪个是最新记录 - 最简单的答案是添加一个列,该列记录插入行时的时间戳。现在,当您查询航班和给定的生效日期时,您只需使用最新插入的时间戳获得结果(可以使用ORDER BY DESC完成并返回第一行)。

您可以仅使用生效日期执行类似查询并返回所有航班 - 再次,对于每个航班,您只想返回包含生效日期但具有最大时间戳的行。有一个巧妙的技巧,可以在逐个组的基础上找到最大值的东西 - 左边将结果连接到自己,以便左边<右边,然后最大值是右边为空的左边的值。 The author of High Performance MySQL gives a simple example of this.

比试图追溯更正旧的时间表要容易得多 - 而且,通过事物的声音,旧的时间表必须保持完整,以满足您的业务需求。这也意味着您可以回答历史问题 - 您可以随时查看您的日程表在给定日期的样子 - 这意味着在生成报告时非常方便,例如“本月的日程安排更改”等等。