2

我正在为一个简单的议程应用程序寻找一个数据库模型,但我找不到任何东西。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 模型,当用户更改原始约会的重复设置时,导致整个系列重新计算,子约会丢失。

嗯,我想就是这样。请告诉我您是否同意这种方法,或者如果您不同意,如果不采取完全不同的方法,您会改变什么。

提前致谢。

4

2 回答 2

1

我不确定你在这里做了什么可怕的事情......

一种想法是完全分解 parentAppointmentId 并构建一个新的关联表,该表仅链接两个任意约会。然后,您可能会添加一些角色或类型列来识别正在定义的关系类型。

通过这种方式,您可以灵活地在系列中允许更复杂的关联(例如跳过 - 重命名等),并允许一个约会可能是许多其他约会的结果或后续 - 而不仅仅是一个约会。

当只考虑标准化时 - 重复信息也严格不是约会本身的一部分。也许考虑将重复信息拉到新表并仅与相关约会相关联。

于 2013-01-25T17:09:18.863 回答
1

派对迟到了 :) 但我喜欢这种设计和考虑。对于任何未来的人,WeeklyRecurrenceDays的一个建议是使用整数,然后将您的天数定义为位字段;1=星期日, 2=星期一, 4=星期二, 8=星期三, 16=星期四, 32=星期五, 64=星期六

使用简单的 AND 功能,客户端应用程序可以确定选择了哪些日期,而无需解析字段中包含的文本。

示例:5=星期日和星期二;127=会是所有的日子;62=工作日;65=周末

于 2017-01-18T17:50:31.800 回答