在我的应用程序中,我有一个对某个主题的响应表。结构大致如下:
CREATE TABLE responses (
id INT NOT NULL PRIMARY KEY,
topic_id INT NOT NULL,
author_id INT NOT NULL,
response TEXT
);
id
是一个自动增量字段,topic_id
并且author_id
是外键,有适当的索引等。
我总是想按插入时间排序,通常是最近的。在大多数情况下,我将按topic_id
. 一个典型的查询如下所示:
SELECT * FROM responses WHERE topic_id=123 ORDER BY id DESC LIMIT 20;
-- or, for pagination:
SELECT * FROM responses WHERE topic_id=123 AND id < 456789 ORDER BY id DESC LIMIT 20;
我想实现一个阻止列表 - 每个用户都有一个author_id
他们不想看到的列表。我需要检索前 20 个结果,不包括那些回复它们author_id
的 s和响应。
确定是否应排除某行非常复杂,虽然可能可以在数据库中执行此操作(在 PL/SQL 中或通过预处理),但我希望将逻辑保留在应用程序中。所以我可以做以下两件事之一:
- 忘记 LIMIT 子句,让查询不受限制。吃行直到我计算出 20 个有效结果,然后关闭查询。
- 应用分块 - 指定 LIMIT 40 并希望它足以获得 20 个“好”结果。如果没有,则获取下一个 40,依此类推。
两者之间的实际区别是什么?特别是。在许多同时用户的性能方面。
我在 PostgreSQL 中这样做,但我愿意切换到不同的 RDBMS。(我不想失去参照完整性,所以我不研究 NoSQL 解决方案)也许我必须调整数据库的一些参数(例如预取大小),以充分利用无界查询案例?