sql - 在关系数据库中存储事件发生的星期几的最佳方法是什么?

标签 sql database-design

我们正在为学校编写记录管理产品,其中一项要求是管理类(class)安排的能力。我还没有查看我们如何处理这个问题的代码(目前我在一个不同的项目中),但我开始想知道如何最好地处理这个要求的一个特定部分,即如何处理这样一个事实每门类(class)可以在一周中的一天或多天举行,以及如何最好地将这些信息存储在数据库中。为了提供一些上下文,一个简单的框架 Course表可能包含以下列:

Course          Example Data
------          ------------

DeptPrefix      ;MATH, ENG, CS, ...
Number          ;101, 300, 450, ...
Title           ;Algebra, Shakespeare, Advanced Data Structures, ...
Description     ;...
DaysOfWeek      ;Monday, Tuesday-Thursday, ...
StartTime       
EndTime           

我想知道的是,处理 DaysOfWeek 的最佳方法是什么?这个(人为的)示例中的列?我遇到的问题是它是一个多值字段:也就是说,您可以在一周中的任何一天开设一门类(class),而同一类(class)可以在一天以上进行。我知道某些数据库本身支持多值列,但是假设数据库本身不支持它,是否有“最佳实践”来处理这个问题?

到目前为止,我已经提出了以下可能的解决方案,但我想知道是否有人有更好的解决方案:

可能的解决方案 #1:将 DaysOfWeek 视为位字段

这是我脑海中浮现的第一件事(我不确定这是否是一件好事......)。在此解决方案中,DaysOfWeek将被定义为一个字节,前 7 位将用于表示星期几(每天一位)。 1 位表示在一周中的相应日期开设了类(class)。

优点 :易于实现(应用程序可以处理位操作),适用于任何数据库。

缺点 :更难编写使用 DaysOfWeek 的查询列(尽管您可以在应用程序级别处理此问题,或在数据库中创建 View 和存储过程以简化此操作),破坏了关系数据库模型。

可能的解决方案 #2:将 DaysOfWeek 存储为字符串

这本质上与使用位域的方法相同,但不是处理原始位,而是为一周中的每一天分配一个唯一的字母,DaysOfWeek column 仅存储一系列字母,指示类(class)进行的日期。例如,您可以将每个工作日与一个单字符代码相关联,如下所示:
Weekday      Letter
-------      ------

Sunday       S
Monday       M
Tuesday      T
Wednesday    W
Thursday     R
Friday       F
Saturday     U

在这种情况下,星期一、星期二和星期五举行的类(class)将具有值 'MTF'DaysOfWeek ,而仅在周三举行的类(class)会有 DaysOfWeek 'W' 的值.

优点 :在查询中更容易处理(即您可以使用 INSTR 或其等效物来确定是否在某一天举行了类(class))。适用于任何支持 INSTR 或等效函数的数据库(大多数,我猜......)。也更易于查看,并且易于一目了然地查看使用 DaysOfWeek 的查询中发生的情况。柱子。

缺点 :唯一真正的“缺点”是,与位域方法一样,这通过在单个字段中存储可变数量的值来打破关系模型。

可能的解决方案 #3:使用查找表(丑陋)

另一种可能性是创建一个新表来存储一周中所有天数的唯一组合,并具有 Course.DaysOfWeek列只是这个查找表的外键。然而,这个解决方案似乎是最不优雅的,我考虑它只是因为它看起来像 The Relational WayTM 做事。

优点 :从关系数据库的角度来看,这是唯一“纯”的解决方案。

缺点 : 既不雅观又麻烦。例如,您将如何设计用户界面来为查找表周围的给定类(class)分配相应的工作日?我怀疑用户是否想要处理诸如“星期日”、“星期日、星期一”、“星期日、星期一、星期二”、“星期日、星期一、星期二、星期三”等等之类的选择……

其他想法?

那么,有没有更优雅的方法来处理单列中的多个值?或者提出的解决方案之一就足够了吗?就其值(value)而言,我认为我的第二个解决方案可能是我在这里概述的三种可能解决方案中最好的一个,但我很想知道是否有人有不同的意见(或者确实是完全不同的方法)。

最佳答案

我会避免使用字符串选项以获得纯度感:它增加了一个您不需要的额外编码/解码层。在国际化的情况下,它也可能会让您感到困惑。

由于一周的天数是 7,我会保留七列,可能是 bool 值。这也将有助于后续查询。如果该工具曾经在工作周在不同日期开始的国家/地区使用过,这也将很有用。

我会避免查找,因为那会过度规范化。除非您的查找项集不明显或可能会发生变化,否则这太过分了。在一周中的几天(例如,与美国各州不同)的情况下,我会用固定装置睡得很香。

考虑到数据域,我认为位域不会为您节省任何显着的空间,只会使您的代码更加复杂。

最后,关于这个领域的警告:许多学校在他们的日程安排上做了奇怪的事情,他们“交换天数”以平衡学期内每种类型的相等数量的工作日,尽管假期。我不清楚你的系统,但也许最好的方法是存储一个表,其中包含类(class)预计进行的实际日期。这样,如果一周有两个星期二,老师可以因为出现两次而获得报酬,而被取消的星期四的老师将不会获得报酬。

关于sql - 在关系数据库中存储事件发生的星期几的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/313417/

相关文章:

SQL Server 更新值 XML 节点

database - 'too many' 在一个表中有多少个字段?

php - 数组数据计算

MYSQL根据当前时间查询结果

mongodb - 使用 MongoDB 管理架构更改

database - 几乎实时存储和导出点击流数据的最佳方式是什么

用于保存随机 bool 表达式的数据库模型

r - 为长数据库进行宽变换,在 R 中对变量进行分组

mysql - 区分表名

php - MySQL在将数据插入不同表时建立关系