【问题标题】:A good way to deal with date and time spans?处理日期和时间跨度的好方法?
【发布时间】:2011-04-29 22:04:44
【问题描述】:

对于我的网络应用,我需要处理访问请求。输入周一至周日时间表的请求,指定每天的小时数。本周计划最多可重复 52 次。一个用户在一周内可以有多个日程安排(周一 8-9 和周一 10-11)有以下要求:

  1. 可搜索/可过滤
  2. 检测重叠请求

我希望数据库能够处理尽可能多的提升。现在我能想到的唯一设计是将每天的访问存储为单独的记录。这样做我会拉取用户的所有访问并循环以确定新请求是否重叠。这需要代码或存储过程。

有没有人有更好的数据库模型想法或处理代码重叠的简洁方法?

【问题讨论】:

  • 单日的“记录”非常原始,未标准化。重复事件和 52 周呢?重复事件(没有人会对手动重复的整体感到高兴)和 52 周呢?跨越一天边界的预订(23:00 到 01:00)呢?跨越一周的界限?你真的必须先自己做一些工作。期望人们为此提供完整的数据模型是不合理的。是的,我有一个完整的 DM,在生产部门工作,但不,它是商业的。
  • 我不想要完整的数据模型。我不是 DBA,我希望朝着正确的方向迈出一步。缺少序列化数据,我现在不知道如何准确地规范化。粒度只需要到分钟,但你提到的所有事情都是非常好的问题。谢谢,我会考虑的
  • 好的。我不使用 Colin 的方法(BETWEEN 等会导致工作表变慢),但我可以向您保证,使用存储 MeetingStartTime 和 MeetingDuration 的标准化(零重复)表对 SQL 代码或性能没有问题。 IE。不存储“跨度”;每次实际会议只有一行;可以轻松识别空块或冲突块。 “跨度”和重复事件是预测。
  • 您如何记录会议重复的次数和间隔?会议可以每年/每月/双月/每周/双周/每天重复吗?这个重复间隔可以混合吗?对于我的应用程序,它目前是每周唯一的间隔,但我很好奇除了为每个可能的间隔添加一列并从那里投影之外,如何处理不同的间隔率

标签: c# database entity-framework database-design data-modeling


【解决方案1】:

如果您将每个访问请求存储在包含 start_time 和 end_time 字段的表中,那么您可以使用数据库的 BETWEEN 功能来确定特定访问是否会与数据库中已有的访问重叠。

例如,假设某人完成了周一上午 9:00 到下午 12:00 的访问请求。

然后其他人来尝试在周一上午 11:00 到下午 3:00 发出访问请求。要确定这是否会与其他内容发生冲突,您需要寻找以下可能的条件:

  • start_time 周一上午 11:00
  • 星期一上午 11:00 和星期一下午 3:00 之间的开始时间
  • start_time == 星期一上午 11:00 || end_time == 星期一下午 3:00

这些可以转化为 SQL 查询,从而避免加载和迭代应用程序中的记录。作为奖励,您可以使用事务来防范竞争条件。

【讨论】:

  • 当他们输入请求时,他们会输入一周中每一天的时间。您的解决方案似乎更多地针对一天的访问。明白我所说的程序是什么意思,因为在一个请求中您最多有 7 天?你会改变你的方法吗?
  • 以同样的方式,您还可以创建一个 SQL 查询,在 WHERE 子句中使用 AND 关键字一次验证所有 7 天。如果您需要单独验证每一天,那么我不确定 - 您可能会进行七次数据库查找,或者找到一种方法从数据库中返回查询中每一天都有 YES/NO 值的结果集。跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-04
  • 2023-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-13
  • 2016-07-25
相关资源
最近更新 更多