gpt4 book ai didi

database-design - 具有循环特征的议程应用数据库模型

转载 作者:行者123 更新时间:2023-12-05 03:15:39 27 4
gpt4 key购买 nike

我一直在为一个简单的议程应用程序寻找一个数据库模型,但找不到。 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))

亮点:

  • 可以通过将DurationInMinutes 的值添加到StartTime 来获得约会结束时间。
  • IsAllDayEvent = 1 时,约会可以持续一整天。在这种情况下,不需要字段 StartTime 和 DurationInMinutes。
  • 循环特征将由应用程序代码计算。即使约会是重复的,它也只在数据库中注册一次,应用程序负责计算重复约会的日期,然后在日历中显示这些日期。为了帮助应用程序更好地执行,应用程序可以只计算日历中可见的时间段。通过将这些计算缓存在某处,在用户更改重复设置或删除约会时将其逐出,可以进一步提高性能。
  • 通过查看 RecurrenceCountRecurrenceEndDate 字段确定重复约会的次数。一次只有其中一个包含一个值。
  • 此模型支持编辑一系列中的一个或多个约会。这就是 ParentAppointmentId 的用途。假设有一个名为“Example appointment”的定期约会,配置为每天重复 5 次。然后假设用户选择仅编辑系列中的第三个约会,将其名称更改为“更新约会”。这将导致应用程序复制数据库中的原始约会记录,但使用新名称并使其引用原始约会(父)。应用程序有责任检测系列中有一个具有不同属性的约会,并在计算要在日历中显示的重复时考虑到这一点,正如我之前提到的。
  • 还是关于 ParentAppointmentId 功能:用户可以取消一系列中的一个或多个约会。例如。 “我希望这个事件发生在所有星期四,但不是在那个特定的星期四”。这将再次使复制过程如上,但将子约会 IsCancelled 字段设置为 1 (true)。然后,应用程序应在日历中显示该系列时“隐藏”此特定约会。
  • 关于 ParentAppointmentId 功能:简化应用程序逻辑,并遵循 Outlook 模型,当用户更改原始约会的重复设置,从而导致重新计算整个系列时,子约会迷路了。

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

提前致谢。

最佳答案

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

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

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

当只是考虑规范化时 - 重复信息严格来说也不是约会本身的一部分。或许考虑将重复信息提取到新表中并仅与相关约会相关联。

关于database-design - 具有循环特征的议程应用数据库模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14526691/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com