hasMany与线程消息应用程序的“hasMany through”数据库结构

时间:2015-01-07 17:15:48

标签: mysql cakephp cakephp-2.0 has-and-belongs-to-many cakephp-model

我正在制作具有基本消息传递功能的PHP / MySQL Web应用程序。两个用户将能够进行"对话"这将包含一系列消息。

以下是我设想的模型关系:

用户> 多对多>会话

对话> 多对多>用户AND 一对多>消息

消息> 所属>对话(它也可以选择属于用户)

为实现这一目标,我需要以下表格/字段:

用户

  • ID
  • ...
  • [很多其他不重要的领域]
  • ...

会话

  • ID

ConversationsUsers

  • USER_ID
  • conversation_id

消息

  • ID
  • USER_ID
  • conversation_id
  • 文本

正如您所看到的,我正在考虑使用ConversationsUsers连接表来管理用户和对话之间的多对多关系。

我的问题:

我试图弄清楚这是否是最好的方法,目前还有两件事让我困扰:

  1. Conversations表只有一个ID字段,其作业只是捆绑消息,似乎效率低下/尴尬。有没有更优雅的方式来做到这一点?

  2. 我需要存储一些有关对话的用户特定数据,例如is_archived。在上面的计划中,除非我将这些字段添加到连接表,否则这是不可能的。我认为这在CakePHP中被称为hasMany through,这是我使用的框架(v2.6.x)。我无法想出一种避免这种情况的方法,但我想知道它是否可能,因为我发现这些关系在过去难以维持。

  3. 欢迎任何有关我的方法的任何其他想法/反馈。

1 个答案:

答案 0 :(得分:0)

你看下面的星形:

Users
    ID
    ...
    [lots of other fields that don't matter]
    ...

Messages

    ID
    unique_conversation_id (put timestamp in this field and use it like unique conversation id and do proper indexing)
    user_id
    text

您可以轻松删除这些拖表对话和对话用户。

保留users表,因为它包含大量信息并仅处理来自消息表的所有其他内容。每个会话都有唯一的转换ID,它将是时间戳。 现在,在此消息表中发生了什么,无论何时创建新对话,您都必须将时间戳放在该移动中,然后将其用作该特定对话的转换ID。