1

我正在尝试设计一个 SQL 模式来表示电子邮件的文件夹结构,但是我遇到了一些困难,虽然关于 SQL 模式的堆栈溢出还有许多其他问题来表示分层文件夹/电子邮件结构,但没有似乎回答了我所有的问题。

我的要求如下:

  • 每个用户都有一个邮箱,这个邮箱包含一些强制文件夹(例如收件箱或已发送)。
  • 每个邮箱还可能包含用户可以创建以组织其邮件的自定义文件夹。
  • 文件夹可以出现在层次结构中,但强制文件夹必须位于根级别。

我想在数据库级别执行许多事情,但无法全部容纳。

  • 强制文件夹每个邮箱只能出现一次。应该不可能在同一个邮箱中插入另一个强制文件夹。
  • 在层次结构方面,父文件夹和子文件夹必须都属于同一个邮箱。

到目前为止,我有两个表,一个“文件夹”表将包含所有邮箱的所有文件夹和一个“系统文件夹”表,其中包含强制表的定义:

CREATE TABLE Folders(
   ID Int
   ,   Mailbox_ID Int
   ,   Name varchar(25)
   ,   Parent_ID Int
   ,   SystemFolder_ID Int
   , PRIMARY KEY (ID)
);

CREATE TABLE SystemFolders(
   ID Int
   ,   Name varchar(25)
   , PRIMARY KEY (ID)
);

我现在的问题是如何添加约束。

  1. 如何强制执行分层完整性(父文件夹或子文件夹必须都属于同一个邮箱)?**
  2. 如何确保在单个邮箱的上下文中只能存在每种类型的一个系统文件夹?**

理想情况下,该解决方案不会特定于任何特定风格的 SQL。任何帮助表示赞赏。

4

1 回答 1

3

如何确保在单个邮箱的上下文中只能存在每种类型的一个系统文件夹?

因为您正在复制文件结构,所以不仅是系统文件夹,而且特定级别中的所有文件夹都必须具有唯一的名称。您可以通过创建唯一性约束来强制执行此操作。此语法应适用于大多数系统:

CREATE TABLE Folders(
   ID Int
   ,   Mailbox_ID Int
   ,   Name varchar(25)
   ,   Parent_ID Int
   ,   SystemFolder_ID Int
   , PRIMARY KEY (ID)
   , CONSTRAINT uFolder UNIQUE (Mailbox_ID,Parent_ID,Name)
);

更新:还需要一个唯一的 SystemFolder_ID,只需添加另一个如上所述的约束,但在 SystemFolder_ID 上:

  , CONSTRAINT uSysFolder UNIQUE (Mailbox_ID,SystemFolder_ID)

对于每个邮箱,特定文件夹中不能有重复的名称。

如何强制执行层次完整性(父文件夹或子文件夹必须都属于同一个邮箱)?

这更复杂。您可能可以使用检查约束来做到这一点,尽管这取决于您的实现(而且这可能不是一个好主意)。另一个可能更好的选择是为此创建触发器。无论哪种情况,您都必须验证特定行的父级和特定行的所有子级。如果您两者都不做,那么以后的修改可能会间接破坏事物。

于 2012-10-04T09:08:19.403 回答