- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我正在创建一个与 gmail 和 facebook 非常相似的线程消息系统,其中收件箱列出了显示主题、发件人姓名和最新消息的时间戳的最新线程。
这是我的表是如何设置的:
users:
user_id
user_name
thread:
thread_id
title
to_id
to_keep
to_read
from_id
from_keep
date
message:
message_id
thread_id
to_id
from_id
message_text
date
我现在正在做的是,当用户创建一条新消息时,它会在线程表中创建一个新线程,然后在消息表中创建一条新消息,如果用户响应一个线程,它会复制当前线程thread 表中的线程,除了它交换 to_id
和 from_id
然后基于它创建一个新消息。
此外,对于收件箱 View ,我可以根据 user_id
查询所有线程。所以像 SELECT * FROM thread WHERE to_id = 2 and to_keep = TRUE ORDER BY date DESC
或者如果我想查看发件箱中的消息,它会像 SELECT * FROM thread WHERE from_id = 2 和 from_keep = TRUE ORDER BY date DESC
。
如果用户在有新消息时打开线程,则 to_read 将更新为 true UPDATE thread SET to_read = TRUE WHERE thread_id = 4
。
我觉得我把这个过程复杂化了,应该有更好的方法来做到这一点。
如有任何帮助或想法,我们将不胜感激。
这样我就可以从线程表中选择所有内容,然后与用户表进行连接以显示我需要的所有内容。但是我觉得应该有更好的方法来做到这一点。
最佳答案
为什么不从用户对每条消息的看法中分离出消息关系?
我会通过消息上的自引用关系进行线程化。换句话说,消息有一个“responding_to_message_id”列。
我不确定我是否理解您为什么有一个“to_id”。消息是否针对个人用户?这似乎非常有限。我认为您要么没有收件人(即收件人是任何人都可以阅读的留言板),要么您可以指定多个收件人,就像使用电子邮件一样。或许您可以解释更多关于如何使用该系统的信息。
假设(为简单起见)您要发布到版 block ,因此只有“发件人”很重要,那么您有消息表,具有线程的自引用关系,用户表,然后是交集表user 和 message 存储每个用户已阅读的消息。
这样,如果您想知道用户是否已阅读消息,只需尝试读取给定消息的交集表中的用户 ID。如果它不在那里,则该用户未阅读该消息。
请注意,如果您希望此设计包含单个收件人,而如果您希望包含多个收件人,则可以使用交集表来保存每条消息的收件人列表。如果您确实有一个收件人交叉表,它可以作为您的阅读状态表执行双重任务。
编辑:ERD 草图:
这是我正在谈论的内容的简要概述...
发件人是否选择保留邮件会在邮件本身上进行标记。如果消息是新线程的开始,则 reply_to_message_id 列为 NULL,否则它是父消息的 message_id。可以有多个收件人,每个收件人都有自己保留或不保留邮件的能力,以及跟踪收件人阅读邮件的日期和时间的能力。
编辑 2:备用 ERD 和查询最近的消息
@OP 询问如何查询线程中的最新消息。答案取决于线程的形式。您可以有一个平面线程,其中每条消息都到达线性消息流的末尾,或者您可以有一个树形线程,其中每个消息都有一个特定的父线程,除非它是线程的根。在上面的 ERD 中,reply_to_message_id 字段可以任意使用。如果线程是扁平的,则 FK 始终指向根 MESSAGE。如果线程是树形的,则 FK 是回复 MESSAGE 的直接父级。
如果您要运行的典型查询是“线程中的最新消息是什么?”并且您的线程是扁平的,那么您可以像这样使用 SQL:
select top 1
M.message_id
, M.sent_datetime
, M.title
, M.message_text
, S.user_id
, S.user_name
-- and anything else you want...
from MESSAGE M inner join USER S
on M.sender_user_id = U.user_id
where M.reply_to_message_id = @ThreadRootMessageID
order by
M.sent_datetime desc
另一方面,如果您的线程是树形的,并且这是一个您希望能够快速轻松地运行的查询,那么上面 ERD 中的模式就不太容易使用。 SQL 不擅长树。您可以通过一点非规范化来解决问题。请参阅下面的 ERD:
请注意,现在有一个 FK 显示直接父级,一个 FK 显示根。由于线程不受编辑的影响 - 至少在消息的根更改为指向不同线程的编辑中,这需要的非规范化并不意味着更新异常的风险,因此冗余不会成为太大问题。
如果您使用此 ERD,则“线程 X 中的最新消息”的查询与上面相同,但在 where 子句中使用 M.thread_root_message_id 而不是 M.reply_to_message_id。
关于php - 创建一个像 facebook 和 gmail 这样的线程私有(private)消息系统,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6420264/
只是出于好奇,我想知道gmail是如何做到的。查看页面源代码后,您看不到任何链接、onclick 方法和 javascript。我知道他们隐藏了 javascript,但页面仍然知道有点击。是否有一个
最近谷歌宣布,出于安全目的,Gmail 将使用代理加载外部图像。这导致我的应用程序在 Gmail 中显示图像时出现问题。 Gmail图片元素检查: https://ci5.googleusercont
我想将节点脚本作为 cronjob 运行,它使用 Gmail 的 API 来轮询我拥有的 gmail 帐户。 我关注 these quickstart instructions : 我被困在第一步。在
如果您在 Gmail 上处于非事件状态,则通过一段时间不移动鼠标,您的聊天状态会更改为橙色,这意味着空闲。但是当您再次开始移动鼠标时,它会变回绿色,表示处于事件状态。它如何知道您何时移动鼠标? 最佳答
您知道,当您加载 GMail 时,左侧会显示“撰写邮件”、“收件箱”、“已发送邮件”等吗?我在页面源代码中搜索了“撰写邮件”,但一无所获。 最佳答案 Gmail 界面使用 JavaScript 动态加
我正在创建一个函数,使用 Google 的 API 从一个人的 gmail 帐户导入联系人。但是我知道许多企业注册 Google 是为了拥有更专业的域名(例如 some_name@bislr.com)
我可以通过桌面应用程序使用 Gmail API 成功读取我的收件箱内容。但是,当我尝试阅读其他人的 gmail 收件箱时,我收到 Delegation denied 异常? 所以我的问题是,Gmail
我已经读到我可以使用 gmail atom 提要从谷歌创建的“内置”标签中获取邮件。 但是当我尝试从“已读”标签获取邮件时,使用 https://mail.google.com/mail/feed/a
通过 Gmail API 发送到 Gmail 地址的邮件在 Gmail 中被标记为“小心处理此邮件。它包含通常用于窃取个人信息的内容。” 该消息基本上只是说测试。并且通过 Gmail SMTP 发送的
编辑 :解决下面的第一条评论,为清楚起见,这不是代码问题。问题很简单: 我应该在新 Gmail UI 的 URI 查询字符串中输入什么来查看 Gmail API 创建的草稿邮件? 尽管这并不是一个真正
我是谷歌产品的新手。我打算开始在 gmail 中添加一些东西。使用类似于 Add on 的 Add on 或 chrome Gmail Extension 更好吗?如果是add-on,我们不能直接在s
使用标准查询格式时,Gmail api 和 Gmail Web ui 的结果有所不同,如下所述 - https://support.google.com/mail/answer/7190 . 该问题专
我正在尝试创建一个 PHP 应用程序,它将自动设置用户的电子邮件签名。这部分有效,我可以为用户设置签名。 我的问题是我在 SendAs 设置中找不到任何选项,该选项将禁用 GMail 中签名前插入的两
我的电子邮件标记通过了电子邮件标记测试器,我尝试了 JSON-LD 和微数据,但无论如何 - 我只是看不到标记在 Gmail (iOS) 客户端中的任何效果。 即使是 Google 自己文档中的基本示
我目前正在使用 Gmail 实验室功能 - canned responses.我有很多这样的预设回复并使用 their menu找到合适的,证明是耗时的。通过以下方式找到预设响应会更容易: 将预设回复
请问是否可以在我的 Gmail 状态中发布倒计时? 像“01:44:15:23”及其不断递减。 最佳答案 发现一个好 article to share : Google Talk 使用 XMPP 那么
我开发了一个上下文小工具并将其安装在我的域中。它在我的域中运行良好,但在我的域之外无法正常工作。如何在我的域外访问我的小工具? 最佳答案 您指的是您的 Google Apps 域吗?根据 Google
我在 this guide 之后配置了推送通知并在调用 watch 时端点我得到大约一周的到期时间。 在此期间,我希望收到有关我已配置的 Pub/Sub 主题的通知,而无需调用 watch。在到期日期
是否有可以在 gmail 中捕获的 API 或事件,以便我可以启动工作流甚至触发 python 脚本。 我正在尝试自动化一项工作,该工作将从已到达 gmail 的电子邮件中提取 csv 附件。然后它会
为什么网络版的 Gmail 会在不使用 = 标记中断位置的情况下对邮件内容进行换行,这使得电子邮件处理变得非常困难: 查看gmail发送的原始邮件内容: 这封由 Mac OS X Mail 发送的邮件
我是一名优秀的程序员,十分优秀!