分层文件夹结构的SQL模式

分层文件夹结构的SQL模式,sql,tree,constraints,Sql,Tree,Constraints,我正在尝试设计一个SQL模式来表示电子邮件的文件夹结构,但是我遇到了一些困难,虽然在堆栈溢出方面还有许多其他问题,关于SQL模式来表示分层文件夹/电子邮件结构,但似乎没有一个能回答我所有的问题 我的要求如下: 每个用户都有一个邮箱,此邮箱包含多个 强制文件夹(例如收件箱或已发送) 每个邮箱还可能包含自定义文件夹,用户可以创建这些文件夹来组织邮件 文件夹可以显示在继承人列表中,但强制文件夹必须位于根级别 有许多事情我想在数据库级别强制执行,但无法满足所有这些要求 每个邮箱只能显示一次强制文件

我正在尝试设计一个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)
);
我现在的问题是如何添加约束

  • 如何强制实现层次完整性(父文件夹或子文件夹必须全部属于同一邮箱)**
  • 如何确保在单个邮箱的上下文中,每种类型只能存在一个系统文件夹**
  • 理想情况下,解决方案不会特定于任何特定的SQL风格。谢谢你的帮助

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

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

    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\u ID,只需如上所述添加另一个约束,但在SystemFolder\u ID上:

      , CONSTRAINT uSysFolder UNIQUE (Mailbox_ID,SystemFolder_ID)
    
    对于每个邮箱,特定文件夹中不能有重复的名称

    我如何强制执行继承人完整性(父文件夹或子文件夹必须 都属于同一个邮箱吗


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

    谢谢你的回答。这里的问题是,我仍然可以将相同的SystemFolder\u ID应用于具有相同邮箱的两行_ID@nukefusion,这可以通过添加另一个约束轻松解决。请参阅我编辑的答案。对不起,我原来错过了那部分。谢谢,太好了。但有一件事-并非所有文件夹都是系统文件夹,因此在某些情况下,SystemFolder\u ID可能为空。这不会导致唯一约束的问题吗?@nukefusion,是的,这可能是一个问题,取决于您的平台
    UNIQUE
    约束应该允许多个null,但对于许多SQL实现来说不是这样。以下是一个关于变通办法的讨论: