我正在尝试设计一个SQL模式来表示电子邮件的文件夹结构,但是我遇到了一些困难,而且还有一些关于SQL模式的堆栈溢出的其他问题来表示层次文件夹/电子邮件结构,似乎没有人回答我的所有问题。
我的要求如下:
我希望在数据库级别执行许多操作,但无法完全满足这些要求。
到目前为止,我有两个表,一个“文件夹”表,它将包含所有邮箱的所有文件夹和一个“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)
);
我现在的问题是如何添加约束。
理想情况下,解决方案不会特定于任何特定的SQL风格。任何帮助表示赞赏。
答案 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)
对于每个邮箱,特定文件夹中不能有重复的名称。
如何强制执行层次完整性(父文件夹或子文件夹必须 都属于同一个邮箱)?
这更复杂。您可以使用检查约束来执行此操作,但这取决于您的实现(并且可能不是一个好主意)。另一个可能更好的选择是为此创建一个触发器。在任何一种情况下,您都必须验证两者特定行的父级和特定行的所有子级。如果你不同时做这两件事,那么后来的修改可能间接地破坏事情。