実用的/可能な限り多くのヘッダー情報を含む電子メール メッセージをデータベースに格納するには、どのようなデータベース スキーマを使用しますか?
それらが MTA からスクリプトに供給され、関連するヘッダー/本文/添付ファイルに解析されたと仮定します。
メッセージ本文全体をデータベース テーブルに保存しますか、それとも MIME パーツを分割しますか? 添付ファイルはどうですか?
メッセージ本文と添付レコードをメッセージの複数の受信者間で共有できるスキーマを使用することができます。ディスク ストレージの 50% が完全に重複した電子メールによって使用されている電子メール サーバーを目にすることは珍しくありません。
そのレコードがすでにデータベースにあるかどうかを確認するには、本文/添付ファイルの単純なハッシュで十分です。ただし、別のヘッダーを保持する必要があります。
何をするかによって異なります。その特定のビットに対して頻繁に検索を行う必要がある場合は、ユースケースに適した方法で分割する必要があります。Sarbanes-Oxley 準拠のための電子メールの保存のようなものであれば、ヘッダー、パーツなどのすべてを 1 つの大きなテキスト フィールドとして保存しても問題ないでしょう。
提案: メッセージの各関連部分 (送信者、ヘッダー、件名、本文) の列を持つ、電子メールを格納するための明確に定義されたテーブルを作成します。たとえば、件名フィールドでクエリを実行する場合は、後ではるかに簡単になります。同じテーブルで、添付ファイルのパスを保持し、添付ファイルを BLOB フィールドに格納するのではなく、ファイル システムに格納するフィールドを定義できます。
データベース スキーマの設計における重要なステップは、モデル化するエンティティの種類を把握することです。このアプリケーションでは、エンティティは次のようになります。
エンティティがわかれば、テーブルで表すことができるエンティティ間の関係を特定できます。
In-Reply-To
メッセージは、メッセージ (およびReferences
ヘッダー)に対して多対多の関係にあります。From
ありますTo
。Cc
ストレージを最適化するために、少なくとも添付ファイルを個別に保存することをお勧めします。ほとんどのユーザーがためらうことなく電子メールに添付する添付ファイル(ビデオなど)のサイズと量を見るのは驚くべきことです。
送信メールの場合、同じ添付ファイルを送信する複数のメールがある場合があります。添付ファイルを共有するすべての電子メールによって参照される添付ファイルの単一のコピーを保存する方がはるかに効率的です。
添付ファイルを個別に保存するもう1つの理由は、後でいくつかのアーカイブオプションが提供されることです。ストレージ容量が問題になった場合は、データベースを圧縮するために、いつでも戻って特定の日付より古い大きな添付ファイルを削除できます。
それはすべて、データで何をしたいかによって異なりますが、一般的には、すべてのデータを保存し、MUA によって解釈されたセマンティクスがデータベースに保存されるようにしたいと考えています。たとえば、次のようになります。 - 解析されるすべてのヘッダー独自の列が必要です - 列にはヘッダー全体が含まれている必要があります - 添付ファイル (本文、マルチパートを含む) は、電子メール テーブルと多対 1 のテーブルにある必要があります。
すでに分割されていて、データを分割するルーチンが適切であると確信できる場合は、テーブルをできるだけ細かく分割します。中間層でいつでも一緒に解析できます。スペースが問題にならない場合は、いつでも 2 回保管できます。1 つは関連するフィールドに分割し、元に戻すのが難しい場合は、全体を 1 つの BLOB として保持する別のフィールドを作成します。