分层文件夹结构的SQL模式
我正在尝试设计一个SQL模式来表示电子邮件的文件夹结构,但是我遇到了一些困难,虽然在堆栈溢出方面还有许多其他问题,关于SQL模式来表示分层文件夹/电子邮件结构,但似乎没有一个能回答我所有的问题 我的要求如下:分层文件夹结构的SQL模式,sql,tree,constraints,Sql,Tree,Constraints,我正在尝试设计一个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)
);
我现在的问题是如何添加约束
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实现来说不是这样。以下是一个关于变通办法的讨论: