mysql - 将冗余信息插入数据库以防止表连接?

标签 mysql sql

<分区>

我正在尝试构建具有以下结构的事件流:

------------------------------------------------------------------------------------
id | activity_by_user_id | activity_by_username | ... other activity related columns
------------------------------------------------------------------------------------

这是将 activity_by_username 也存储在事件表中的好方法吗?我知道这会一次又一次地用相同的用户名弄乱表格。但如果没有,我将不得不与用户表进行连接以获取用户名。

我的网络应用程序中的用户名永远不会改变。

有了这个,我将不再需要将此表与用户表连接起来。这是实现我需要的最佳方式吗?

最佳答案

您的建议是对数据结构进行非规范化。这种方法有优点也有缺点。

显然,您认为性能将是一个优势,因为您不需要在每一行中查找 username。这可能不是真的。查找应该在表的主键上并且应该非常快。甚至在某些情况下,存储冗余信息可能会减慢查询速度。当字段大小很大并且同一用户有很多应用程序时会发生这种情况。然后,您会在冗余数据上浪费大量存储空间,从而增加表的大小。不过,通常情况下,您会期望看到适度的 - 非常适度的 - 性能改进。

与此相平衡的是您正在存储冗余数据这一事实。因此,如果更新了用户名,那么您将不得不使用新信息更改很多行。

总的来说,如果您在您的环境中对真实数据进行了测试并且性能改进是值得的,我只会建议您采用这种方法。我怀疑您是否会看到很大的改进,但布丁就是证据。

顺便说一下,有些情况下需要非规范化数据结构来支持应用程序。我不认为使用主键查找字段可能是其中之一。

关于mysql - 将冗余信息插入数据库以防止表连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24458782/

相关文章:

php - 从android中的mysql数据库中检索edittext中的数据

mysql - group_concat 问题 (mysql)

mysql - Rails 和 MySql 日期时间行为

php - 使用 PHP 发布多个 HTML 表单字段

php - 加速计算速率的 SQL 查询

mysql - 如何在 group by query 中使用 distinct?

php - 从两个表中选择并按时间戳排序

mysql - 更新限制或类似的东西

php - 按日期对 MySQL 查询结果进行分组,每个组都有标题和自己的 div

javascript - SQL.js(SQLite JavaScript 实现)可以立即自动写入磁盘吗?