Sql 如何在RDBMS中表示预定事件?

Sql 如何在RDBMS中表示预定事件?,sql,database-design,relational-database,rdbms,Sql,Database Design,Relational Database,Rdbms,我必须存储可以每周、每天或每月组织的预定活动(比如说上课时间)。事件可以发生,比如说,每个星期一和星期三,或者每个月的第二个星期四。有没有办法将这些信息存储在遵循3NF的RDBMS中 编辑:这不是作业;我正在和一个朋友一起为我们自己的教化做一些东西,我们想要3NF 具体来说,我试图存储RC教区弥撒和忏悔时间的时间表。这些可以通过很多方式安排,比如每个周日x时间或每个周二/周四不同的时间。有时这只是一个月的第三个星期五,而另一些则只在一年中的某个特定时间提供。我不仅需要存储这些信息,还需要查询这些

我必须存储可以每周、每天或每月组织的预定活动(比如说上课时间)。事件可以发生,比如说,每个星期一和星期三,或者每个月的第二个星期四。有没有办法将这些信息存储在遵循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日结束的一个确定的学校学期——可以包含多个时间表(因此艺术课每周一,物理教育“每隔一天”——但你需要做更多的工作来考虑假期和周末!)。

记录“定期重复”的规则,您可以从的格式中获得灵感,当然,您不需要限制分钟和小时,而是需要限制星期几、月几等等。由于日程表中可能有多个(例如)工作日,因此出于NF目的,您需要使用典型的中间表来表示多对多关系,即每行只有两个外键的中间表(一个到事件主表,一个到工作日表),当然,对于月内的几天,也是如此

大概每个预定的事件都会有一个持续时间、一个类别、一个位置、一个名称或描述


“有多正常”的形式(一旦您处理了上述多个关系的“集合”)主要取决于这些不同属性是否以及如何相互依赖-例如,如果某个类别中的每个事件都具有相同的持续时间,您将需要一个单独的辅助表,其中包含id、类别和持续时间,并在该表中使用外键,而不是重复配对信息。但是从你所说的来看,我没有发现任何内在的违反正常形式规则的情况,除了这种依赖性可能性(这不是你对活动日程安排的一点规定所固有的)。

从长远来看,在论坛上发布家庭作业对你没有多大好处。你有没有想过?你已经走了多远?虽然这可能是家庭作业,但也肯定不是家庭作业。我不认为给一个问题贴上家庭作业的标签是特别合适的,除非它显然是这样,而且这是一个有着有趣解决方案的问题。。。。这就是说,这肯定是一个重复,我只是找不到其他的…恢复作业标签。理由:除了学生,谁需要3NF作为要求?在一个企业中,首先是“做什么就做什么”,其次是“做什么效率最高(或最快)。@Gortok:我不同意。我编写的应用程序的需求与此非常接近,直到今天,我还从未对如何处理它感到满意。这当然是一个合法的问题,正如OP所说,这不是家庭作业@阿斯汀:不,不是这样。这是我想到的两个问题:,谢谢。我已经想到了一个几乎完全像这样的解决方案,尽管我可能会使用一个枚举(我在postgres上)而不是一个工作日表。正如我上面提到的,这些事件肯定不会有相同的持续时间。可能,它们甚至应该有任意的持续时间。我也建议使用cron模型。不要担心规范化——不是所有的数据结构都是关系型的。根据我的经验,您可能希望使用SQL以外的一些方法来具体化可调度元素的实际实例。与其存储任意的持续时间,不如存储开始日期和结束日期。例外情况和周/月类型列在哪里?