多年来在MySQL可用日期存储的最佳方式

时间:2010-10-25 16:30:11

标签: mysql date

我们正在开发带有假日套餐的MySQL数据库(带前端和后端)。除了存储旅行套餐出发日期的最佳方法之外,我们已经找到了一切。

有些套餐几乎每天都有 ;其他只在周二和周三提供;其他人在五月到九月的每个星期一离开;其他套餐一年中只有几个具体日期;等等...

我们需要将每次旅行与适当的出发日期相关联。然后,我们需要执行“给我那些在日期X上可用的软件包”类型的查询,“给我一些我可以在一月的第一周拿到的软件包”,“给我那些日期X和Y之间的旅行“等等。

这样做的简单方法是每天按位存储365位。但就存储空间而言,这显然不是一个好的解决方案。保持日期范围将是一个很好的解决方案,因为大多数软件包仅在一周中的某些日期可用,因此无法在范围内进行最佳编码。

任何人都可以帮助我们解决这个问题吗?我们如何将旅游出发日期保留在数据库中?

非常感谢!

Ramon的

3 个答案:

答案 0 :(得分:2)

由于您需要执行查找确切日期的查询,我猜您需要存储确切的日期。文本信息(“周一”,“冬季周四和周五”......)也应存储,但仅用于提供信息(例如,在旅游信息页面中显示)。

至于日期,您有两种选择:

1)个人日期

tour_id date
======= ==========
      1 2010-12-01
      1 2010-12-02
      1 2010-12-05
      2 2010-01-15

2)日期范围:

tour_id from_date  to_date
======= ========== ==========
      1 2010-12-01 2010-12-05
      2 2010-01-15 2010-01-15

我认为#1更容易维护。

答案 1 :(得分:1)

这是我建议的格式。

将您的可用日期存储在单独的表中作为间隔(开始日期,结束日期)。优惠将有一个或多个间隔。对于每个间隔,为一周中可用的日期定义一个7位限制过滤器(默认将所有位设置为1)。如果您只需要一个日期,则可以选择Start = End。当然,这个模型并没有涵盖所有情况,但对我来说似乎已经足够了,如果你有很多优惠仅在一周的某些日子有效,它可能会很有用。

您可能还想从您的间隔中排除某些日期。为此,您需要另一张桌子存放个人日子。

示例:

id | start | end | week_days
1 | 2011-01-01 | 2011-03-31 | 1111100 - The offer is available in any weekday from January to March
2 | 2011-01-31 | 2011-01-31 | 1111111 - An offer available just in one day

如果您想使用例外,那么您可以使商品#1无效,因为您添加了商品#2:

id | id_period | date
1 | 1 | 2011-01-31

答案 2 :(得分:0)

除了在此数据库中显示日期之外,您是否会做任何事情,例如预订?因为那将强烈指向比逐位解决方案更进一步:每个出发日期有一条记录

存储空间问题应该是无关紧要的,除非您有数万亿的旅行,这是不太可能的。但是查询日期,构建完全不规则的间隔以及取消范围内的选择日期变得非常容易。

这方面的难点在于编辑。创建新游览时,您必须根据指定的间隔创建日期记录。如果间隔稍后更改,则必须回滚创建。