分层文件夹结构的SQL模式

时间:2012-10-04 08:07:26

标签: sql tree constraints

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

我的要求如下:

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

我希望在数据库级别执行许多操作,但无法完全满足这些要求。

  • 每个邮箱只能显示一次强制文件夹。应该不可能将另一个强制文件夹插入同一个邮箱。
  • 就层次结构而言,父文件夹和子文件夹必须全部属于同一邮箱。

到目前为止,我有两个表,一个“文件夹”表,它将包含所有邮箱的所有文件夹和一个“SystemFolders”表,其中包含必需表的定义:

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. 如何确保在单个邮箱的上下文中只能存在每种类型的一个系统文件夹?**
  3. 理想情况下,解决方案不会特定于任何特定的SQL风格。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:2)

  

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

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

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)

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

  

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

这更复杂。您可以使用检查约束来执行此操作,但这取决于您的实现(并且可能不是一个好主意)。另一个可能更好的选择是为此创建一个触发器。在任何一种情况下,您都必须验证两者特定行的父级和特定行的所有子级。如果你不同时做这两件事,那么后来的修改可能间接地破坏事情。