1

我正在我正在创建的网站上编写电子邮件系统的简化版本。

基本前提是用户可以在网站上互相发消息,最好的例子是 ebay,你可以在网站本身上给其他用户发消息,它基本上就像一个电子邮件系统。

我所拥有的是消息本身,来自谁,发给谁以及文本。

我还希望有基本的“已读/未读”和“已删除”,甚至可能是“已发送”类别。

像这样的东西:

表结构:

id、to、from、subject、body、dateTime

我想知道的是,在该表中添加“已读”和“已删除”列是否更有意义,并在我在网站上需要它们时搜索这些特定条件,或者它是否更有效/最佳实践是有另一个“类别”表,然后有一个连接表放置一个带有类别 ID 的消息 ID,然后在请求时使用该连接表来提供信息?

如果我的问题没有意义,请原谅我,我对这些东西还是很陌生。

4

4 回答 4

3

我会添加两列:

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

我会为这个系统创建三个表。一个用于您的线程(一组消息),一个用于您的实际消息,另一个用于您的类别。

像这样的东西,

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)

这将是一个适当规范化的数据库。

有了这个,一个线程可以包含一对多的消息(因为外键是 in MessagesContent),一条消息只附加到一个踏板上,一个线程可以有一个类别。

根据您的规范,我认为这是存储消息的最有效方式。

于 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 回答