我正在我正在创建的网站上编写电子邮件系统的简化版本。
基本前提是用户可以在网站上互相发送消息,最好的例子是ebay,你可以在网站本身向其他用户发送消息,它基本上充当了电子邮件系统。
我所拥有的是信息本身,他们来自哪里,以及文本。
我还希望有基本的“读/不读”和“删除”,甚至可能是“已发送”类别。
类似的东西:
表格结构:
id,to,from,subject,body,dateTime
我想知道的是,将“读取”和“删除”列添加到该表更有意义,并在网站上需要时搜索这些特定条件,或者是否更有效/最佳做法是拥有另一个“类别”表,然后有一个连接表,将消息ID与类别ID放在一起,然后使用该连接表在请求时提供信息?
如果我的问题没有意义,请原谅我,我对这些东西还很陌生。
答案 0 :(得分:3)
我会添加两列:
read tinyint(1),
deleted tinyint(1)
并将它们用作布尔值。
答案 1 :(得分:3)
我刚刚实现了类似的东西。我把列放在“消息”表中。我选择了以下内容:
ReadDate DATETIME DEFAULT NULL,
如果未读取消息,则ReadDate为NULL。当用户阅读它时,我会填写它的阅读日期。这允许发送者知道接收者何时读取它。
答案 2 :(得分: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)
这将是一个正确规范化的数据库。
有了这个,一个线程可以包含一对多的消息(因为外键在MessagesContent
中),一条消息只附加到一个脚本,一个线程可以有一个类别。
根据您的规范,我认为这是存储邮件的最有效方式。
答案 3 :(得分: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;
希望这有帮助。