繁体   English   中英

mysql:设计实践

[英]mysql: design practices

我有这样的表设置:
一条消息被发送给一组用户。

此消息放在parent_message表中
该表包含id | sender_id | date id | sender_id | date

该组中发送的每个消息都放在child_message表中
该表包含id | parent_id | message | date_sent id | parent_id | message | date_sent

收到答复后,将其放入reply_message表中
该表包含id | child_id | message | date_received id | child_id | message | date_received id | child_id | message | date_received

现在,我对此设置有一些疑问。


1)每次加载页面时,我需要显示每个父消息有多少个子消息。
您是在parent_message表中添加一列称为child_count还是在查询中进行计算。
为什么,为什么不呢?

查询示例

 select *, count(select parent_id from child_message c where c.parent_id = p.parent_id ) child_count from parent_message; 

2)如果用户选择,他们可以查看对父邮件的所有答复邮件。
您将parent_id添加到replyreply_message表中还是在查询中解决?
为什么,为什么不呢?

查询示例

 select * from reply_message where child_id in(select id from child_message where parent_id = '66') 

您可能最好在两种情况下都解决它,但我会重写查询

SELECT 
   p.*
   count(child.*) childCount
FROM 
   parent_message p
   LEFT JOIN  child_message  c
   on c.parent_id = p.parent_id

SELECT DISTINCT
       rm.*
    FROM 
        reply_message rm
        INNER JOIN child_message  cm
        rm.child_id = cm.id 
   WHERE
       parent_id = '66'

我也将列出字段而不是执行SELECT *

我会说这很大程度上取决于邮件的数量。 如果系统中有一百万条消息,则加入child_message可能会变得非常昂贵。 在这种情况下,将child_count添加到父表可能对您的性能有利。 您的第二个用例也是如此。 当然,这是数据的一些非规范化,因此,如果您的系统允许重塑主题和答复(例如拆分主题),则在这种情况下,您必须进行额外的记账。

另一种方法是创建索引表,如果您不需要信息始终保持100%的准确性,则该索引表将保存您需要的信息并以异步方式离线更新它们。

表message_counts(parent_id,child_count)

然后,在将新消息添加到系统时(例如通过使用触发器)安排这些更新。

因此,最重要的是,除非遇到性能问题,否则请保持表正常化,就像它们一样。 当您期望收到数以百万计的消息和答复时,某些反规范化可以帮助加快处理速度。 索引表可以帮助离线创建聚合统计信息,除非您需要它们是准确和最新的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM