15

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

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

4

1 回答 1

17

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

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

图表


这是通过 MySQL Workbench 导出的 MySQL 脚本。

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

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。
于 2013-06-27T21:12:39.157 回答