mysql - 网络消息系统的数据库结构

标签 mysql database database-design architecture messaging

我想制作一个像 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 本身不能被删除,因为我需要它知道消息是在左侧(作为发送者)还是在右侧(作为接收者)。该系统仅适用于两人消息系统。

基本上这两个表是相同的,但是哪个是实现这个消息系统的最佳实践?先谢谢你。

最佳答案

在艰难地学习之后(很久以前,在最终项目中......),我可以建议您尽可能将事物分开和组织。如果可能,不要靠近 self 关系是一件好事(极少数异常(exception))。一开始就设计你的类(class);然后建立一个数据库,其中的东西很适合,但要保持它们应该的简单。

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

Diagram


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

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

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。

关于mysql - 网络消息系统的数据库结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17341686/

相关文章:

php - 在 PHP/Mysql 中单击按钮更新价格表

php - 警告:PDO::__construct(): [2002] 没有这样的文件或目录(试图通过 unix:///tmp/mysql.sock 连接)

mysql - Mysql编译好的程序存放在什么位置?

database - IMMUTABLE、STABLE 和 VOLATILE 关键字如何影响函数的行为?

sql - 存储人类可读的 UUID 的最小方法是什么?

node.js - 为什么在 sequelize 的 createTable 函数中忽略了 allowNull (false) 选项

android - 对于以 SQLite 和 Azure SQL 数据库作为中央存储的在线/离线多客户端移动应用程序来说,最佳主键策略是什么?

php - 如何在 MySQL 或 PHP 中选择不同,仅适用于连续值

php - MySQL 查询在新的 phpmyadmin 上不起作用

mongodb - Trello 如何在 MongoDB 中存储数据? (每板收集?)