存储此类信息的适当方式
本文关键字:方式 类信息 存储 | 更新日期: 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)
这将使您能够添加多种颜色,然后将多个跨度应用于每种颜色。它还允许您将特定的跨度标记为假日跨度,如果您愿意,可以添加不同的布尔值来跟踪周末跨度。