mysql:设计实践

标签 mysql database-design

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

这条消息被放入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/

相关文章:

mysql - 使用 bash 从 csv 文件导入日期到 mysql

PHP PDO - 连接过多时显示密码

mysql - 如何在 mysql DB 的 Sequelize 中使用 FIND_IN_SET

sql - 如何指定银行帐号的最小和最大数字?

java - 如何从 MySQL 获取所需格式的 JSON

database-design - 时钟 - 表设计

database - 如何明智地保持更新多个 postgres 数据库、表和函数

sql - 在 delete 语句中忽略聚簇索引和覆盖索引。表扫描发生

mysql - 多选复选框sql设计

mysql - 简单的MYSQL查询问题