gpt4 book ai didi

mysql - 当有多个 JOINS 时,使用非规范化设计不是更好吗?

转载 作者:行者123 更新时间:2023-11-29 18:48:30 24 4
gpt4 key购买 nike

这是我的表结构:

// posts
+----+-----------+---------------------+-------------+
| id | title | body | keywords |
+----+-----------+---------------------+-------------+
| 1 | title1 | Something here | php,oop |
| 2 | title2 | Something else | html,css,js |
+----+-----------+---------------------+-------------+

// tags
+----+----------+
| id | name |
+----+----------+
| 1 | php |
| 2 | oop |
| 3 | html |
| 4 | css |
| 5 | js |
+----+----------+

// pivot
+---------+--------+
| post_id | tag_id |
+---------+--------+
| 1 | 1 |
| 1 | 2 |
| 2 | 3 |
| 2 | 4 |
| 2 | 5 |
+---------+--------+

如您所见,我以两种方式存储关键字。两者都作为字符串放入名为 keywords 的列中,并作为关系放入其他表中。

<小时/>

现在我需要选择具有特定关键字的所有帖子(例如 phphtml 标签)。我可以通过两种方式做到这一点:

1:使用非标准化设计:

SELECT * FROM posts WHERE keywords REGEXP 'php|html';

2:使用标准化设计:

SELECT     posts.id, posts.title, posts.body, posts.keywords 
FROM posts
INNER JOIN pivot ON pivot.post_id = posts.id
INNER JOIN tags ON tags.id = pivot.tag_id
WHERE tags.name IN ('html', 'php')
GROUP BY posts.id
<小时/>

看到了吗?第二种方法使用两个JOIN。我猜它会比在巨大的数据集中使用 REGEXP 慢。

你觉得怎么样?我的意思是你的建议是什么以及为什么?

最佳答案

The second approach uses two JOINs. I guess it will be slower than using REGEXP in huge dataset.

你的直觉根本就是错误的。数据库设计用于执行 JOIN。他们可以利用索引和分区来加速查询。更高级的数据库(比 MySQL)使用表的统计信息来选择执行查询的最佳算法。

您的第一个查询始终需要对 posts 进行全表扫描。您的第二个查询可以通过多种方式进行优化。

此外,使用第一种方法来维护数据中数据的一致性要困难得多。您可能需要实现触发器来处理所有表上的更新和插入。这会减慢速度。

在某些情况下,值得付出努力来做到这一点 - 考虑汇总计数或美元或时间总计。将标签放入分隔字符串中的好处要小得多,因为相对于其他成本而言,在 SQL 中解析字符串不太可能带来真正大的好处。

关于mysql - 当有多个 JOINS 时,使用非规范化设计不是更好吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44470003/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com