1

電子メールのフォルダ構造を表す SQL スキーマを設計しようとしていますが、いくつかの問題があり、階層的なフォルダ/電子メール構造を表す SQL スキーマに関するスタック オーバーフローに関する質問は他にもたくさんありますが、どれもありません。私が持っているすべての質問に答えているようです。

私の要件は次のとおりです。

  • 各ユーザーにはメールボックスがあり、このメールボックスには多数の必須フォルダ (受信ボックスや送信済みなど) が含まれています。
  • 各メールボックスには、ユーザーがメールを整理するために作成できるカスタム フォルダーが含まれている場合もあります。
  • フォルダーは階層に表示できますが、強制フォルダーはルート レベルにある必要があります。

データベース レベルで強制したいことがたくさんありますが、それらすべてに対応することはできませんでした。

  • 必須フォルダーは、メールボックスごとに 1 回だけ表示される場合があります。同じメールボックスに別の強制フォルダーを挿入することは不可能であるべきです。
  • 階層に関しては、親フォルダーと子フォルダーはすべて同じメールボックスに属している必要があります。

これまでのところ、すべてのメールボックスのすべてのフォルダーを含む "Folders" テーブルと、必須テーブルの定義を含む "SystemFolders" テーブルの 2 つのテーブルがあります。

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. 1 つのメールボックスのコンテキスト内に各タイプのシステム フォルダーが 1 つだけ存在できるようにするにはどうすればよいですか?**

理想的には、ソリューションは、特定の SQL のフレーバーに固有のものではありません。どんな助けでも感謝します。

4

1 に答える 1

3

1 つのメールボックスのコンテキスト内に各タイプのシステム フォルダーが 1 つだけ存在できるようにするにはどうすればよいですか?

ファイル構造を複製しているため、システム フォルダーだけでなく、特定のレベルのすべてのフォルダーに一意の名前を付ける必要があります。これは、一意性制約を作成することで強制できます。この構文は、ほとんどのシステムで機能するはずです。

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 に答える