我有这样的表格设置:
一条消息被发送给一组用户。
这条消息被放入parent_message
表
此表包含 id |发件人编号 |日期
在该组中发送的每条消息都放在 child_message
表中
此表包含 id |父 ID |留言 |发送日期
收到回复后,它会被放入reply_message
表
此表包含 id | child 编号 |留言 | 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 添加到回复 reply_message 表还是在您的查询中解决?
为什么,为什么不呢?
示例查询
select * from reply_message
where child_id in(select id from child_message where parent_id = '66')
最佳答案
我会说这在很大程度上取决于消息的数量。如果系统中有一百万条消息,连接到 child_message 的开销会非常大。在这种情况下,将 child_count 添加到父表可能对您的性能有益。您的第二个用例也是如此。当然,这是数据的一些非规范化,因此如果您的系统允许 reshape 主题和回复(如拆分主题),那么在这种情况下您必须进行额外的簿记。
另一种方法是创建索引表,它保存您需要的信息并以异步方式离线更新它们,如果您不需要信息始终保持 100% 准确,例如
表message_counts (parent_id, child_count)
然后在系统中添加新消息时安排更新这些消息,例如通过使用触发器。
所以最重要的是,除非您遇到性能问题,否则请保持表格正常化,就像它们一样。当您期望有数百万条消息和回复时,一些反规范化可以帮助加快速度。索引表有助于离线创建聚合统计数据,除非您需要它们是准确和最新的。
关于mysql:设计实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4729879/