我正在为一个简单的议程应用程序寻找一个数据库模型,但我找不到任何东西。StackOverflow 有很多关于这个问题的问题,但没有一个提供具体的答案。所以我进一步研究并提出了我自己的模型,我将其展示给您,以便您帮助我评估和改进它。并且可以作为将来寻找这个的人的参考。
此模型的灵感来自 Outlook 提供的功能,尽管它被大量削减。它旨在得到大量应用程序代码的支持。
CREATE TABLE dbo.Users (
UserId UNIQUEIDENTIFIER NOT NULL,
CONSTRAINT PK_Users PRIMARY KEY (UserId))
CREATE TABLE dbo.Appointments (
-- Keys.
AppointmentId INT IDENTITY NOT NULL,
ParentAppointmentId INT NULL,
UserId UNIQUEIDENTIFIER NOT NULL,
-- General fields.
EventDescription VARCHAR(500) NULL,
EventName VARCHAR(50) NOT NULL,
-- Schedule fields.
IsCancelled BIT NOT NULL, /* To cancel only one appointment in a series of recurring appointments. */
AppointmentDate DATE NOT NULL,
IsAllDayEvent BIT NOT NULL,
StartTime TIME NULL, /* This field is required in case IsAllDayEvent = false */
DurationInMinutes INT NULL, /* This field is required in case IsAllDayEvent = false */
RecurrenceCount SMALLINT NULL,
RecurrenceEndDate DATE NULL,
RecurrenceType TINYINT NULL, /* 1 = Daily, 2 = Weekly (other recurrence types are not supported by design) */
WeeklyRecurrenceDays VARCHAR(13), /* 1,2,3,4,5,6,7 (each number represents a day of the week, where 1 = sunday) */
-- Constraints.
CONSTRAINT PK_Appointments PRIMARY KEY (AppointmentId),
CONSTRAINT PK_Appointments_Appointments FOREIGN KEY (ParentAppointmentId) REFERENCES dbo.Appointments(AppointmentId),
CONSTRAINT FK_Appointments_Users FOREIGN KEY (UserId) REFERENCES dbo.Users(UserId))
强调:
- 可以通过添加 to 的值来获得约会结束
DurationInMinutes
时间StartTime
。 - 约会可以持续一整天,当
IsAllDayEvent = 1
. 在这种情况下,不需要字段 StartTime 和 DurationInMinutes。 - 重复特征将由应用程序代码计算。即使约会是重复的,它也只会在数据库中注册一次,并且应用程序负责计算重复约会的日期,然后在日历中显示这些日期。为了帮助应用程序更好地执行,应用程序可以只计算日历中可见的时间段。通过将这些计算缓存在某处,当用户更改重复设置或删除约会时将它们逐出,可以实现进一步的性能。
RecurrenceCount
通过查看或RecurrenceEndDate
字段来确定重复约会的次数。一次只有一个应该包含一个值。- 此模型支持编辑一系列中的一个或多个约会。这就是它的
ParentAppointmentId
用途。假设有一个称为“示例约会”的定期约会,配置为每天重复 5 次。然后假设用户选择仅编辑系列的第三个约会,将其名称更改为“更新约会”。这将导致应用程序复制数据库中的原始约会记录,但使用新名称,并使其引用原始约会(父)。正如我之前提到的,应用程序有责任检测系列中存在具有不同属性的约会,并在计算要在日历中显示的重复时将其考虑在内。 - 仍然是关于该
ParentAppointmentId
功能:用户可以取消一个或多个约会。例如,“我希望这个事件在所有星期四发生,但不是在那个特定的星期四”。这将再次进行上述复制过程,但将子约会IsCancelled
字段设置为1
(true)。当在日历中显示系列时,应用程序应该“隐藏”这个特定的约会。 - 还是关于这个
ParentAppointmentId
功能:为了简化应用程序逻辑,并遵循 Outlook 模型,当用户更改原始约会的重复设置时,导致整个系列重新计算,子约会丢失。
嗯,我想就是这样。请告诉我您是否同意这种方法,或者如果您不同意,如果不采取完全不同的方法,您会改变什么。
提前致谢。