Php 用于私有消息传递的单个mysql表

Php 用于私有消息传递的单个mysql表,php,mysql,database,database-design,Php,Mysql,Database,Database Design,我正在尝试为网站上的私人消息创建一个表。我创建了下表,我认为这是有效的,但我真的希望得到一些反馈 CREATE TABLE IF NOT EXISTS `pm` ( `id` int(11) NOT NULL AUTO_INCREMENT, `user_id` int(11) NOT NULL, `to` int(11) NOT NULL, `date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `subject` varch

我正在尝试为网站上的私人消息创建一个表。我创建了下表,我认为这是有效的,但我真的希望得到一些反馈

CREATE TABLE IF NOT EXISTS `pm` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) NOT NULL,
  `to` int(11) NOT NULL,
  `date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `subject` varchar(255) DEFAULT NULL,
  `message` text NOT NULL,
  `read` tinyint(1) NOT NULL DEFAULT '0',
  `deleted` tinyint(1) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`)
  FOREIGN KEY (user_id) REFERENCES User(user_id)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
我有两列来确定消息的状态:
read
deleted

如果
read=1
,则消息已被接收器读取。如果
deleted=1
,则发件人或收件人会从已发送或已接收的收件箱中删除邮件。如果
deleted=2
两个用户都删除了该消息,则从数据库表中删除该行

一些评论:

不错

我会给这张桌子起个名字,其他人可能会断章取义地猜出来。所以也许是私人信息而不是pm

我会在用户列名上显式显示,因此可能是从用户id到用户id,而不是“用户id”和“到”


我会考虑将状态拔出到具有状态、用户标识和日期的新表中,这将给您在时间上对消息做什么的灵活性更大。

< P>显示接收器的收件箱和发件人发件箱(并且分别能够删除消息),您可能需要当前编码的更多信息。我建议为每一方设置一个“已删除”字段。(只要每端仅限于一个用户且没有广播消息,这就行了。但是,这不能扩展到广播消息,这需要多个表才能有效地执行)

您可能还希望在删除时强制执行与
的键关系
和在更新时强制执行与
的键关系

FOREIGN KEY (user_id) REFERENCES User(user_id) ON DELETE CASCADE ON UPDATE CASCADE,
FOREIGN KEY (to) REFERENCES User(user_id) ON DELETE CASCADE ON UPDATE CASCADE
删除或修改用户会将更改或删除传播到messages表。

一些注释:

Charset=latin1
会惹恼一些人的,我建议
Charset=utf8

我建议不仅在
user\u id
上签入外键,而且在
to
上签入外键

另外,我在
date
上放置了一个索引,因为您将对该字段进行大量排序

您需要将“已删除”拆分为两个字段,否则您将不知道是哪个用户删除了该邮件。(
由用户删除,
由收件人删除


请注意,
date
是一个保留字,您需要在查询中将其更改为
message\u date
`backtick`

我看到您没有明确说明任何索引。在表上设置适当的索引可以显著提高性能。我也相信,对于您的消息栏,您可能想考虑让我一个VARCHAR与最大大小显式声明。除了那两件你可能已经料理好的东西之外,我觉得你的桌子还不错。

MySQL表性能指南:

  • 向表中添加适当的索引。索引不仅仅用于主键/唯一键,还可以将它们添加到经常引用的列中
  • 明确说明最大长度。固定长度表比对应的表快
  • 始终有一个id列
  • 尽可能添加NOTNULL。空值仍然占用空间
  • 了解您的数据类型。知识就是力量,可以节省性能和空间
  • 有趣的文章:






    我列出的文章和某些项目可能不是100%正确或可靠的,因此,如果您有兴趣进一步调整您的性能,请确保您自己做一些研究。

    我认为您可能需要添加一个名为Parent_Message_ID的列,该列将包含Parent mail ID。以便还可以包含回复。
    如果你想在将来给你的私人信息添加回复。

    在信息如此之少的情况下,很难评估此表的有效性。MySQL用于保存数据。此表包含数据。对于消息传递系统,此表是否足够?是的,它有足够的空间来满足信息系统的核心需求。除此之外,如果不知道您计划如何使用它、引用它、如何构建应用程序、将使用什么设计方法等,就无法判断此实现的实用性。谢谢!这些都是很好的建议。我会在发送者和接收者身上加上外文以避免重复信息,是吗?在日期添加索引会不会因为索引也需要更新而减慢更新速度?而且更新会经常发生。这是我唯一关心的。@CyberJunky,显示按
    日期排序的邮件也会经常出现,因此在插入和更新时维护索引的额外成本将超过
    选择时间。谢谢!我也在计划,不知道该怎么做谢谢你的建议,我正在考虑。不过,我认为将回复添加为普通邮件会更简单,但在原始邮件周围添加标记,并在主题字段上添加
    Re:
    。我想如果我特别想显示我的所有回复,就需要一个家长信息id。你会在回复中存储问题的所有文本吗?当然,就像在电子邮件中一样。回复时,用第一条消息填充文本区域,用户可以在上面写下自己的消息。事后想一想,一个父消息列可能更好,这样我就不必重新输入文本,也不会有太大的值。你也可以有回复、评论、提醒等消息类型。这些字符串可以在单独的表中,并且您的主表将有一个列消息\u类型。。。基于此,您可以发送提醒(将禁用回复),或允许用户添加评论,因此您的主表是messages表。您的邮件主题和文本位于单独的表格中,用户可以查看提醒。。。但是,这些将根据您想要的功能/流程而定。因此,在注释中添加您指的是一个表和另一个表中与消息相关的所有内容,以处理每行的消息类型