[英]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
。
现在,我对此设置有一些疑问。
查询示例
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.