1

作成中のサイトで簡易版の電子メール システムを作成しています。

基本的な前提は、ユーザーがサイト上で互いにメッセージを送ることができるということです。最も良い例は ebay です。サイト自体で他のユーザーにメッセージを送ることができ、基本的には電子メール システムとして機能します。

私が持っているのは、メッセージ自体、誰から、誰に、そしてテキストです。

また、基本的な「既読/未読」および「削除済み」、場合によっては「送信済み」のカテゴリも作成したいと考えています。

このようなもの:

テーブル構造:

id、to、from、subject、body、dateTime

私が知りたいのは、そのテーブルに「読み取り」列と「削除済み」列を追加して、サイトで必要なときにそれらの特定の条件を検索する方が理にかなっているのか、それともより効率的かということです/別の「カテゴリ」テーブルを作成し、結合テーブルにカテゴリ ID を含むメッセージ ID を配置し、その結合テーブルを使用して、要求されたときに情報を提供することをお勧めしますか?

私の質問が意味を成さない場合は、私を許してください。私はこのことについてはまだかなり新しいです。

4

4 に答える 4

3

2つの列を追加します:

read tinyint(1),
deleted tinyint(1)

それらをブール値として使用します。

于 2012-04-16T13:31:54.290 に答える
3

私はちょうど似たようなものを実装しました。「メッセージ」テーブルに列を配置しました。私は以下を選びました:

ReadDate DATETIME DEFAULT NULL,

メッセージが読まれていない場合、ReadDate は NULL です。ユーザーがそれを読んだら、読んだ日付を記入します。これにより、送信者は、受信者がいつそれを読んだかを知ることができます。

于 2012-04-16T13:44:07.497 に答える
1

このシステム用に 3 つのテーブルを作成します。1 つはスレッド (メッセージのグループ) 用、1 つは実際のメッセージ用、もう 1 つはカテゴリ用です。

このようなもの、

MessagesThreads
--------------------
id (int, serial)
from (int, foreign: Users.id)
to (int, foreign: Users.id)
subject (varchar)
category (foreign key: Categories.id)

MessagesContent
--------------------
id (int, serial)
threadId (int, foreign: MessagesThreads.id)
content (text)
date (datetime)
status (tinyint) (0 for unread, 1 for read, 2 for deleted, for instance)

Categories
--------------------
id (int, serial) 
name (varchar)

これは、適切に正規化されたデータベースになります。

これにより、スレッドは 1 対多のメッセージを含むことができ (外部キーが にあるためMessagesContent)、メッセージは 1 つのトレッドのみに添付され、スレッドは 1 つのカテゴリを持つことができます。

仕様によると、これがメッセージを保存する最も効率的な方法だと思います。

于 2012-04-16T13:42:43.827 に答える
0

次のようなユーザー アカウント テーブルがあるとします。

CREATE TABLE tbl_accounts(
    id INT NOT NULL AUTO_INCREMENT,
    PRIMARY KEY(id),
    email_addr VARCHAR(50) NOT NULL,
    passkey BLOB /* AES KEY */
) ENGINE = InnoDB;

ユーザーアカウントとチェックしているフォルダー(受信箱|送信箱)に応じてメールを見つけるには、メールボックステーブルが必要です。このテーブルを分離して、データベースを「正規化」します。

CREATE TABLE tbl_email_box(
    account_id INT, /* owner|sender of mail */
    FOREIGN KEY (account_id) REFERENCES tbl_accounts(id) ON DELETE SET NULL,
    email_id INT,
    FOREIGN KEY (email_id) REFERENCES tbl_emails(id) ON DELETE SET NULL,

    folder TINYINT(1), /* 0=inbox->account=owner; 1=outbox->account=sender; */

    status TINYINT(1) DEFAULT 0, /* 0=unread, 1=read */

    date TIMESTAMP     /* because the query executes when they check/send mail, */
                       /* then record is created (date=sent|received date) */
) ENGINE = InnoDB;

このテーブルには、実際の電子メール データが格納されます

CREATE TABLE tbl_emails(
    id INT NOT NULL AUTO_INCREMENT,
    PRIMARY KEY(id),
    subject VARCHAR(100),
    message BLOB,
    created TIMESTAMP
) ENGINE = InnoDB;

お役に立てれば。

于 2012-04-16T14:07:40.113 に答える