首页 文章

用于存储一周中不同日期值的最佳表模式是什么?

提问于
浏览
1

我有一个网站,您可以通过下拉框选择时间段 . 下拉框中的项目类似于:

  • 早上6点 - 上午10点

  • 上午10点 - 下午1点

  • 下午1点 - 下午4点

我将它存储在一个包含2列的数据库表中 . ID和说明 . (所以我只是将字符串“6AM - 10AM”存储在varchar字段中)

我现在需要添加一个日期选择器,以便用户可以选择日期和时间段 . 我有一个日期选择器全部接线,然后我意识到我有一个新的要求:

我需要支持一组不同的时间段,具体取决于当天 . 例如,如果是星期五,它可能是:

  • 早上6点 - 上午10点

  • 上午10点 - 下午1点

  • 下午1点 - 下午4点

但如果是星期六,可能是:

  • 6AM - 8AM

  • 8AM - 12PM

  • 下午1点 - 下午2点

我想弄清楚我需要哪些新表来存储这些信息 . 我最初的想法是 .

  • 不要创建任何新表,但是简单添加一个名为DayOfWeek的额外字段,当我需要加载我的下拉列表时,我会根据当前的当天查询并且只是选择时段

  • 创建新表以尝试使用时间段加入星期几以使其更加规范化 .

我想看看人们是否有关于存储这些信息的理想数据库表设计的反馈 .

1 回答

  • 1

    Option 1


    让我们说你有这种结构

    Hours      |  WeekDay | Weekend
    -------------------------------   
    6AM - 10AM |     1    |   0
    10AM - 1PM |     1    |   0 
    1PM - 4PM  |     1    |   0
    6AM - 8AM  |     0    |   1
    8AM - 12PM |     0    |   1
    1PM - 2PM  |     0    |   1
    

    即使有两种类型,SQL看起来也很混乱

    Select  Hours 
    From
          hoursTable  
    Where 
         (weekDay = 1 and {WeekDayParam} = 1)
         or
         weekEnd = 1 and {WeekEndParam} = 1
    

    Option 2


    如果它看起来像这样

    Hours      |  Type  
    ---------------------   
    6AM - 10AM |     1 
    10AM - 1PM |     1    
    1PM - 4PM  |     1 
    6AM - 8AM  |     2   
    8AM - 12PM |     2   
    1PM - 2PM  |     2
    

    然后sql更直接

    Select  Hours 
     From
          hoursTable  
     Where 
         type = {typeParam}
    

    How do we deal with new requirements


    我们如何添加另一个变体:假期

    你想要

    Hours        |  WeekDay | Weekend | Holiday 
    -----------------------------------------  
    6AM - 10AM   |     1    |   0     |  0       
    10AM - 1PM   |     1    |   0     |  0
    1PM - 4PM    |     1    |   0     |  0
    6AM - 8AM    |     0    |   1     |  0
    8AM - 12PM   |     0    |   1     |  0
    1PM - 2PM    |     0    |   1     |  0
    10:30PM  2PM |     0    |   1     |  0
    

    要么

    Hours        |  Type  
    ---------------------   
    6AM - 10AM   |     1 
    10AM - 1PM   |     1    
    1PM - 4PM    |     1 
    6AM - 8AM    |     2   
    8AM - 12PM   |     2   
    1PM - 2PM    |     2   
    10:30PM  2PM |     3
    

    请注意,在第一个解决方案中,每次获得新的小时策略时,您必须更新数据结构的sql和调用代码,但在第二个解决方案中,您不需要?

    继续第二个解决方案 .

相关问题