【问题标题】:Database Structure for Web Messaging System网络消息系统的数据库结构
【发布时间】:2013-06-24 20:50:06
【问题描述】:

我想制作一个像 facebook 这样的网络消息传递系统。我已经想到了数据库结构的许多替代方案,但不确定哪个是最佳实践。我这里有两个选择,第一个是使用两个表,第二个是使用三个表但在 ERD 中循环。

第一个:两个表,其中消息表引用自己

user
----------
id
name

message
--------------
id
from_id
to_id
message_id --> refer to this table itself, to make me know which message is the topic
subject
content
time
status --> inbox, outbox, archive
read --> read, unread

第二个:三个表,但是在erd中做一个循环

user
----------
id
name

message_header
--------------
id
from_id
to_id
subject
status --> inbox, outbox, archive
time

message
--------
id
message_header_id
content
time
read --> read, unread
author_id

我个人喜欢这种结构,因为它只使用一个消息头和多个消息(内容)。无法删除 author_id 本身,因为我需要它知道消息是在左侧(作为发送者)还是在右侧(作为接收者)。该系统仅适用于两人消息系统。

这两个表基本上是一样的,但是实现这个消息传递系统的最佳实践是什么?之前谢谢你。

【问题讨论】:

    标签: mysql database database-design architecture messaging


    【解决方案1】:

    在经过艰苦的学习之后(很久以前,在最终项目中......),我可以建议您尽可能将事物分开和组织。如果可能的话,不要靠近自我关系是一件好事(很少有例外)。一开始就设计你的课程;然后建立一个数据库,其中的东西很适合,但要保持它们应该的简单。

    我的偏好是......比说的更好:


    Here is the MySQL Script 通过 MySQL Workbench 导出。

    列出来自某个标头的消息的可能查询是

    SELECT
      h.id AS `header_id`, h.`subject`, h.`status`,
      m.id AS `message_id`, m.content, m.`time`,
      IF(m.is_from_sender, x.`name`, y.`name`) AS `written_by`
    FROM (SELECT * FROM header WHERE id = @VAR) h
      INNER JOIN message m ON (h.id = m.header_id)
      INNER JOIN user x    ON (h.from_id = x.id)
      INNER JOIN user y    ON (h.to_id = y.id);
    
    • 您会看到我个人对位字段的偏好。例如,一旦您的目的是建立一个两人消息系统,您实际上不必多次记住某个 from_id。

    【讨论】:

    • 消息应该按照回复某个消息的顺序链接,还是应该按照时间戳列出
    • 使用回复顺序(优先使用更高的 id)可能会便宜一些,但您可能会考虑时间戳排序(当然,使用适当的索引)更友好,以防万一有人在没有互联网的情况下回答并且有效地将消息发送到数据库需要一些时间。也就是说,你决定:>
    • “is_from_sender”属性有什么用?
    • 它告诉你邮件的作者是否是表header中指定的作者id=from_idid=to_id
    • 这是一个很好的 sql 实用程序,因为当您有一个单独的标头时,您不会从 id 到 id 进行双重存储,这不仅仅是为了分离本身。
    猜你喜欢
    • 2017-12-06
    • 1970-01-01
    • 1970-01-01
    • 2010-10-10
    • 2011-09-26
    • 2012-12-03
    • 2015-01-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多