Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 存储此类信息的适当方式_C#_Database_Oracle_Database Design_Relational Database - Fatal编程技术网

C# 存储此类信息的适当方式

C# 存储此类信息的适当方式,c#,database,oracle,database-design,relational-database,C#,Database,Oracle,Database Design,Relational Database,我必须将以下信息存储到数据库中,以供.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:00 周六和周日 我最初使用的数据库模式如下: 列名ID Pk Null?数据类型默认直方图加密 Alg盐 红色\

我必须将以下信息存储到数据库中,以供.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:00 周六和周日

我最初使用的数据库模式如下:

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

红色\u工作日\u开始14 Y数字无
红色\u工作日\u结束15 Y数字无
红色\u周末\u开始16 Y数字无
红色周末结束17 Y数字无
琥珀色\u工作日\u开始18 Y数字无
琥珀色\u工作日\u结束19 Y编号无
琥珀色\u周末\u开始20 Y数字无
琥珀色\u周末\u结束21 Y编号无
绿色\u工作日\u开始22 Y数字无
绿色\工作日\结束23 Y编号无
绿色\u周末\u开始24小时无编号
绿色周末结束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
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
琥珀色:09:00-16:30和18:30-20:30周一至周五,包括银行假期和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
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)) 

我会让它正常化一点。首先,我要有一个表,标识“颜色”:

然后,使用包含适用的开始/结束时间的表格进行跟进:

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

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

银行假日可以每年更改。您可能需要一个DateTime和HolidayName对的表,您需要每年更新该表。目前我只需要指定该颜色是否为银行假日,确定该颜色是否为活动颜色的逻辑将另行处理。如果您只需要能够记录每种颜色的多组设置,然后按照@iefpw的建议-制作一个主颜色表,以及一个每种颜色设置的详细表。谢谢Mark,我想你已经做到了