数据库效率/结构问题

时间:2012-04-16 13:28:09

标签: php mysql database normalization

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

基本前提是用户可以在网站上互相发送消息,最好的例子是ebay,你可以在网站本身向其他用户发送消息,它基本上充当了电子邮件系统。

我所拥有的是信息本身,他们来自哪里,以及文本。

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

类似的东西:

表格结构:

id,to,from,subject,body,dateTime

我想知道的是,将“读取”和“删除”列添加到该表更有意义,并在网站上需要时搜索这些特定条件,或者是否更有效/最佳做法是拥有另一个“类别”表,然后有一个连接表,将消息ID与类别ID放在一起,然后使用该连接表在请求时提供信息?

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

4 个答案:

答案 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;

希望这有帮助。