用于评论系统的DB

时间:2010-10-11 18:08:20

标签: mysql database database-design cakephp comments

我想创建一个2级状态消息系统。哪个是创建表的最佳方法?

范围:

  1. 用户设置状态消息
  2. 用户回复状态消息
  3. 这是一张显示它的照片

    alt text

    我创建的表格

    用户(id,name ....) status_messages(id,message,time,user_id) status_message_replies(id,message,time,status_message_id,user_d)

    有人建议可以采用单一表格格式

    status_messages(id,pid,message,time,user_id)

    其中pid = selfId或ParentId状态。

    我想知道哪个是创建系统的最佳方法?

2 个答案:

答案 0 :(得分:2)

经典的IS-A关系:每个回复都是带有额外属性的消息(消息是回复)。 这可能不是建模它的最佳方式。您将面临必须在这两个表上编写大量UNION查询的风险。

备选方案:

  • 只有一个表:status_messages (id, message, time, status_message_id, user_id),并允许status_message_id为NULL
  • 使用HAS-A:一个表status_messages (id, message, time, user_id)和一个表replies (reply_id, replies_to_id

前者的缺点是在SQL中使用NULL很棘手。 当您想要专门查询回复时,后者将需要加入。

BTW更清楚(IMO)在他们所代表的关系之后命名列,而不是他们所指的表。

答案 1 :(得分:2)

只要原始消息和响应具有相同的结构(属性集或列),就可以使用单表方法。它的优点是您可以使用单个查询搜索原始邮件和响应。

可以在pid = selfid和pid<>的响应中找到原始消息集。 selfid。如果能够分别查看原始消息和响应消息(不了解存储机制),则可以将上述条件封装在两个VIEW中:OriginalMessages和Responses。

如果原件和响应具有不同的属性(例如,如果您希望原件允许链接到URL,照片等),您可以考虑使用两个单独的表。但即使在那里,我也可能会争论一个表结构,其中包含一个单独的扩展表,用于附加属性。这意味着您不必为那些不使用扩展属性的原始消息存储常常为空的列,稍后您也可以轻松地将扩展属性添加到响应消息中(如果需要)。