6

我必须存储可以每周、每天或每月组织的预定活动(例如上课时间)。例如,事件可能发生在每个星期一和星期三,或者每个月的第二个星期四。有没有办法将此信息存储在符合 3NF 的 RDBMS 中?

编辑:这不是作业;我正在和一个朋友一起为我们自己的教育构建一些东西,我们希望它在 3NF 中。

具体来说,我正在尝试在 RC 教区存储弥撒和忏悔时间的时间表。这些可以通过多种方式安排,例如每个星期日的 x 时间或每个星期二/星期四的不同时间。有时它只是每月的第三个星期五,而其他人只在一年中的某个时间提供一次。我不仅需要存储这些信息,还需要查询它,这样我就可以快速获得接下来一天或一周或其他任何时间的可用时间的完整列表。

我想严格来说 3NF 不是必需的,但如果是这样对我们来说会更容易,并且最好立即纠正它而不是稍后更改我们的模式。

4

2 回答 2

2

是的,我已经通过以下方式与我的同事解决了这个问题:

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. 我最初是沿着这条路线开始的,但发现上面的方法更加简单和可维护。

单个日期/时间跨度 - 例如从 9 月 9 日开始到 11 月 4 日结束的定义的学期 - 可以包含多个时间表(因此艺术课每周一,物理课“每隔一天” - 但你需要做考虑假期和周末的更多工作!)。

于 2009-06-19T03:21:00.833 回答
2

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

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

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

于 2009-06-19T03:28:02.740 回答