如何在RDBMS中表示预定事件?
-
06-07-2019 - |
题
我必须存储可以按周,每天或每月组织的预定事件(例如说课时)。事件可能发生在每个星期一和星期三,或每月的每个星期四。有没有办法将这些信息存储在符合3NF的RDBMS中?
编辑:这不是作业;我正和朋友一起为我们自己的教化做点什么,我们想要它在3NF。具体来说,我正试图在RC教区存储大量和告白时间的时间表。这些可以在很多方面安排,例如每个星期天的x时间或每个星期二/星期四的不同时间。有时它只是本月的第三个星期五,而其他只在一年一次的某个时间提供。我不仅要存储这些信息,还要查询它,以便我可以快速获得第二天或一周或任何时间的可用时间的完整列表。
我认为严格来说3NF并不是一个要求,但如果是这样的话我们就会更容易,而且最好是让它更正确,而不是以后更改我们的架构。
解决方案
是的我通过以下方式与同事解决了这个问题:
CREATE TABLE [dbo].[Schedule](
[ID] [int] IDENTITY(1,1) NOT NULL,
[StartDate] [datetime] NOT NULL,
[EndDate] [datetime] NULL
)
CREATE TABLE [dbo].[ScheduleInterval](
[ID] [int] IDENTITY(1,1) NOT NULL,
[ScheduleID] [int] NOT NULL,
[ScheduleIntervalUnitID] [int] NOT NULL,
[Interval] [smallint] NOT NULL
)
CREATE TABLE [dbo].[ScheduleIntervalUnit](
[ID] [int] NOT NULL,
[Name] [varchar](50) NULL
)
INSERT INTO ScheduleIntervalUnit (ID, Name)
SELECT '1' AS [ID], 'Day' AS [Name] UNION ALL
SELECT '2' AS [ID], 'Week' AS [Name] UNION ALL
SELECT '3' AS [ID], 'Month' AS [Name]
计划跨越一段时间,并且在该时间长度内发生间隔。计划间隔单元确定间隔的长度(天数,如“每隔一个”(2)或“每三个”(3)等),周(星期几,例如星期一,星期二等)和月份(日历年)。使用此功能,您可以对数据库执行查询和逻辑以检索计划。
如果您的日程安排需要更好的解决方案 - 小时,分钟,秒 - 请查看 cron
的Unix实现。我最初开始沿着这条路走下去,但发现上面的方法更为简单和可维护。
单个日期/时间跨度 - 例如从9月9日开始到11月4日结束的定义学校学期 - 可以包含多个时间表(因此每个星期一为Art class,而“每隔一天”为Phys Ed - 但是你'我需要做更多的工作来考虑假期和周末!)。
其他提示
要记录“定期重复”的规则,您可以从 crontab <中获取灵感。 / a>的格式,当然除了你不需要在几分钟和几小时的约束,而是一周中的一天,一个月的日期等。由于不止一个(例如)工作日可能在计划中,因此对于NF目的,您将需要用于表示多对多关系的典型中间表,即每行只有两个外键(一个到主事件表) ,一个工作日的表格 - 当然还有几个月的日子等。
据推测,每个预定的活动也会有持续时间,类别,可能是位置,名称或描述说明。
“多么正常”是形式(一旦你用上面提到的许多关系来处理“集合”)主要取决于这些不同属性是否以及如何相互依赖 - 例如,如果某个类别中的每个事件都具有相同的持续时间,您将需要一个具有id,类别和持续时间的单独辅助表,并在此表中使用外键而不是重复配对信息。但是根据你的说法,我没有看到任何内在违反正常形式规则的情况,除了这种依赖性可能性(这些并不是你在事件调度中指定的内容所固有的)。