2012-03-05 13 views
1

私はメールを保管するテーブルMailsを持っています(誰が考えていたでしょう...;)))。SQLのメールテーブル:分割するか分割しない?

tinyint MailStatus私はそれがSentMailかDraftかReceivedMailかどうかを決めます。表の分割がよりappropiateではないでしょう場合

は、今、私が思っていた、有し:代わりにMailStatusのTINYINTフラグの

MailsSent

MailsDraft

MailsReceived

しかし、それは、ユーザーがメールを削除したり移動したりするときに、単にint値を切り替えるのではなく、行を移動(1つのテーブルに挿入、削除)する必要があることを意味します。

これについてのご意見はありますか?

+0

あなたの質問は主観的で、stackoverflowは主観的ではありません;あなたが直面している特定の問題はありますか?例えばメールテーブルが大きすぎる/効率的に作業するのが面倒ですか? –

+0

いいえ、それはまだありませんが、バイナリの内容を含む数千のメールがテーブルに含まれていると効率が悪くなるかどうかはわかりません。そして、私はそれのために "SQLメールのベストプラクティス"のようなものがあるだろうと思った。 – SeToY

答えて

2

コードの観点から、異なる型を扱うよりもはるかに列挙型を処理する方が簡単です。

とDBの観点から、別のテーブルで、この非常に類似したデータを格納するための理由は以下のとおりです。

  • パフォーマンスが
  • サイズの問題(単一のテーブルが大きくなりすぎ)
  • デシベル正規化の懸念(ヌルを発行SentDateTimeフィールドなどの値)

ほとんどの場合、サイズやパフォーマンスの問題は発生しません。データを正規化する方法さあ。実際に気にしない場合は、それよりも複雑にしないでください。これを1つのテーブルに残して、テーブルの列挙型(int)を使用してステータスを区別します。

2

電子メールはフォルダに分類することができるので、このようなフォルダ/電子メールステータスを格納する追加テーブルMailFoldersを作成することをお勧めします。

Mailテーブルの外部キーをMailFoldersに使用します。いくつかのフォルダをシステムフォルダとして指定し、他のものをユーザフォルダとして指定することができます(また、ユーザIDの外部キーを含めることもできます)。

また、アプリケーションの設計と要件によって異なります。

2

私は個人的にフラグを保持し、それをインデックスします。そうすれば、巨大なテーブルであっても、テーブルから情報をすばやく取得できます。メールがあるフォルダから別のフォルダに移動した場合にのみ、フラグを変更できます。これにより、サーバーとログファイルの負荷が軽減されます。