【问题标题】:hasMany vs. "hasMany through" DB structure for threaded message app线程消息应用程序的 hasMany 与“hasMany through”数据库结构
【发布时间】:2015-01-07 17:15:48
【问题描述】:

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

这是我构想的模型关系:

用户 > 多对多 > 对话

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

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

为此,我需要以下表格/字段:

用户

  • 身份证
  • ...
  • [许多其他无关紧要的字段]
  • ...

对话

  • 身份证

对话用户

  • user_id
  • conversation_id

消息

  • 身份证
  • user_id
  • conversation_id
  • 文字

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

我的问题:

我正在尝试确定这是否是最好的方法,目前有两件事困扰着我:

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

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

欢迎对我的方法提出任何其他想法/反馈。

【问题讨论】:

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


    【解决方案1】:

    你好,请看下面的staructure:

    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 表,因为它包含大量信息并仅处理来自 messages 表的所有其他内容。每个对话都有唯一的转换 ID,它将是时间戳。 现在这个消息表中发生了什么,每当您创建新对话时,您必须仅在该移动中放置时间戳,然后将其用作该特定对话的转换 ID。

    【讨论】:

    • 谢谢。但是在这个系统中,我如何跟踪对话是is_archived 还是has_unread?
    • 想更多...此对话中的其他用户?我担心数据库结构的极简主义会导致控制器中有很多额外的逻辑。
    • 太多的表会导致死锁,但额外的逻辑不会。假设您希望其他用户找到与特定转换相对应的所有消息,然后操作该数组以获取所有用户,这可以使用 book.cakephp.org/2.0/en/core-utility-libraries/… 完成
    • 好的。但我仍然不清楚你的建议如何解决我的问题。有没有办法存储对话“元”数据,例如has_unread 等?
    • 您可以在消息表 has_unread 中再添加一个字段,这将解决您的问题。如果您谈论关系,那将是多对多。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-29
    • 2019-11-17
    • 2010-11-14
    • 2018-01-29
    • 1970-01-01
    • 2011-09-26
    • 1970-01-01
    相关资源
    最近更新 更多