我正在开发一个项目,该项目可以同步多个集群上的内容。我想使用两个程序来执行此任务。一个程序会定期更新每个群集上内容的存在状态,而另一个程序会在一个内容不在所有群集上时进行内容复制。
数据库表是按以下方式设计的。
table contents -- stores content information.
+----+----------+
| id | name |
+----+----------+
| 1 | content_1|
| 2 | content_2|
| 3 | content_3|
+----+----------+
table clusters -- stores cluster information
+----+----------+
| id | name |
+----+----------+
| 1 | cluster_1|
| 2 | cluster_2|
+----+----------+
table content_cluster -- each record indicates that one content is on one cluster
+----------+----------+-------------------+
|content_id|cluster_id| last_update_date|
+----------+----------+-------------------+
| 1 | 1 |2020-10-01T11:30:00|
| 2 | 2 |2020-10-01T11:30:00|
| 3 | 1 |2020-10-01T10:30:00|
| 3 | 2 |2020-10-01T10:30:00|
+----------+----------+-------------------+
第一个程序会定期更新这些表(可能会更改一些表,大多数表保持不变)。第二个程序迭代地获得一个内容记录,该内容记录不在所有群集上。选择查询如下。
SELECT content_id
FROM content_cluster
GROUP BY content_id
HAVING COUNT(cluster_id) < <cluster_number>
LIMIT 1;
似乎不太有效,因为我必须在每个查询中对表进行分组。 因为我不熟悉数据库,所以我想知道这是否是设计数据库的好方法。我必须添加一些索引吗?如何编写选择查询以使其生效?