存储此类信息的适当方式

本文关键字:方式 类信息 存储 | 更新日期: 2023-09-27 18:23:59

我必须将以下信息存储到数据库中,以便.NET程序集使用。它们代表某种颜色处于活动状态的时间:

红色:16:30-18:30周一至周五包括银行假日
琥珀色:09:00-16:30&周一至周五18:30-20:30(包括银行假日);16:30-18:30周六;太阳
绿色:00:00-09:00&20:30-周一至周五24:00(包括银行假日);00:00-16:30*18:30-24:00Sat&Sun

我最初开始使用这样的数据库模式:

列名ID Pk为空?数据类型默认直方图加密阿尔及利亚盐

RED_WEEKDAY_START 14 Y编号无
RED_WEEKDAY_END 15 Y数字无
RED_WEEKEND_START 16 Y数字无
RED_WEEKEND_END 17 Y编号无
AMBER_WEEKDAY_START 18 Y编号无
AMBER_WEEKDAY_END 19 Y编号无
AMBER_WEEKEND_START 20 Y编号无
AMBER_WEEKEND_END 21 Y编号无
GREN_WEEKDAY_START 22 Y编号无
GREEN_WEEKDAY_END 23 Y编号无
GREEEN_WEEKEND_START 24 Y数字无
GREEEN_WEEKEND_END 25 Y编号无

然而,有几个问题:

  • 根本不处理银行假日
  • 每种颜色只允许一段时间(例如,绿色在工作日被分割)

那么,存储此类数据的更好方法是什么呢?

存储此类信息的适当方式

五列

Colour | Day | StartTime | EndTime | AppliesOnBankHolidays

(红色:16:30-18:30周一至周五包括银行假日)翻译为

RED|Mon|16:00|18:30|True
RED|Tue|16:00|18:30|True
RED|Wed|16:00|18:30|True
RED|Thu|16:00|18:30|True
RED|Fri|16:00|18:30|True

琥珀色:09:00-16:30&周一至周五18:30-20:30(包括银行假日);16:30-18:30周六;Sun翻译成

AMBER|Mon|09:00|16:30|True
AMBER|Tue|09:00|16:30|True
AMBER|Wed|09:00|16:30|True
AMBER|Thu|09:00|16:30|True
AMBER|Fri|09:00|16:30|True
AMBER|Mon|18:30|20:30|True
AMBER|Tue|18:30|20:30|True
AMBER|Wed|18:30|20:30|True
AMBER|Thu|18:30|20:30|True
AMBER|Fri|18:30|20:30|True
AMBER|Sat|16:30|18:30|False
AMBER|Sun|16:30|18:30|False

我将离开第三行作为练习!

如果你真的想节省空间,可以随意将日期和颜色正常化。银行假日问题需要另一个银行假日表,您可以在使用的任何查询中加入该表:

伪SQL

SELECT t.Colour, t.StartTime, t.EndTime
FROM Times t 
WHERE Day(Today)==t.Day AND NOT (t.AppliesOnBankHolidays==FALSE AND IsBankHoliday(Today)) 

您必须为每个条目创建一个表和第二个表。将会有一对多的关系。您使用第二张表上的外键。插入主条目,获取其主键,并为每个键创建该键的多行。一对多关系。你必须把它彻底分解。这里的密钥是数据库生成的主键和外键。

我会稍微规范一下。首先,我会有一个表格来识别"颜色":

fldColorID          | int
fldColorName        | varchar(28)
fldColorDescription | varchar(128)   (might not be necessary)

然后用一个包含适用的开始/结束时间的表格跟进:

fldSpanID               | int
fldStartTime            | datetime
fldEndTime              | endtime
fldIsHoliday            | bit
fldSpanDescription      | varchar(128)   (necessary from a human readability point)
fldColorID              | int  (FK)

这将使您能够添加多种颜色,然后将多个跨度应用于每种颜色。它还允许您将特定的跨度标记为假日跨度,如果您愿意,可以添加不同的布尔值来跟踪周末跨度。