存储此类信息的适当方式

时间:2012-02-09 14:29:49

标签: c# database oracle database-design relational-database

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

  

红色:16:30-18:30周一至周五银行假期
  琥珀:09:00-16:30&周一至周五18:30 - 20:30包括Bank Holidays&   周六16:30 - 18:30孙
  绿色:00:00至09:00& 20:30 -   周一至周五24:00银行假期& 00:00 - 16:30 * 18:30 - 24:00   周六&太阳

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

  

列名ID Pk Null?数据类型默认直方图加密   Alg盐

     

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号码无   GREEN_WEEKDAY_START 22 Y号码无
  GREEN_WEEKDAY_END 23 Y号码无
  GREEN_WEEKEND_START 24 Y号码无
  GREEN_WEEKEND_END 25 Y号码无

但是有几个问题:

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

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

3 个答案:

答案 0 :(得分:2)

五列

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包括Bank Holidays&周六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

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

如果您真的想节省空间,请随意标准化日期和颜色。银行假期问题需要另一张银行假期表,您可以在任何查询中加入该表:

PSEUDO SQL

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

我会稍微规范这一点。首先,我有一个表格来确定“颜色”:

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)

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