SQL 语句中的条件 VS 后面代码中的条件
Conditions in SQL statement VS conditions later in code
考虑这个 myTable
有一些当天的记录:
+-----+---------------------+---------------------+
| id | start_date | end_date |
+-----+---------------------+---------------------+
| 1 | 2017-07-17 12:00:00 | 2017-07-17 14:00:00 |
| 2 | 2017-07-17 8:00:00 | 2017-07-17 11:00:00 |
| 3 | 2017-07-17 13:00:00 | 2017-07-17 15:00:00 |
+-----+---------------------+---------------------+
假设我想 get records that overlap 12:00:00 -> 14:00:00
(其中 12->14 是 目标)。
本质上,对 (RecordStart <= TargetEnd) and (RecordEnd >= TargetStart)
有效的记录
我可以使用以下其中一项来做到这一点:
1- sql 语句中的条件:
const myQuery =
"SELECT * FROM myTable " +
"WHERE start_date <= '" + target_end_date +
"' AND '" + target_start_date + "' <= end_date";
let filtered = DbConnection.query(myQuery)
2-代码中的条件:
const myQuery = "SELECT * FROM myTable";
let records = DbConnection.query(myQuery)
let filtered = [];
records.map((rec) => {
if(Date.parse(rec.start_date) <= Date.parse(target_end_date) && Date.parse(target_start_date) <= Date.parse(rec.end_date) )
filtered.push_back(rec)
})
我应该遵循哪种做法?
更一般地说,选择最佳实践是面向案例的?这是否取决于数据库有多大 and/or 结果会有多大?或者有一些我还不知道的关于sql vs code的知识?
作为程序员,我是否为每个用例构建两种方法并进行测试然后选择?
编辑:
考虑到每个 processing-related/querying 事情都会发生在 API 端,然后 filtered
(这两种方法的最终结果相同)将通过网络发送返回给客户。
利用 Sql 功能进行过滤将是:
- 性能
- 减少网络带宽使用
- 可维护
- 快速实施
ETC
毕竟Database是用来存储数据和进行CRUD操作的
使用 sql 过滤记录有两个原因。一是减少流经网络的数据量。第二个是尽量减少应用程序所需的 RAM 量。如果您引入太多数据,您可能会遇到堆 space 问题。
这里有两点需要考虑:
- 尽可能提取最小、最有效的结果集
- 尽可能少地访问数据库
您几乎总是希望专注于提取尽可能小、最高效的结果集。 IE。在 SQL.
中进行过滤
唯一应该在代码而不是 SQL 查询中过滤的情况是,如果您已经 需要 将整个 table 拉入内存并且稍后将过滤以不同方式查看它。
考虑这个 myTable
有一些当天的记录:
+-----+---------------------+---------------------+
| id | start_date | end_date |
+-----+---------------------+---------------------+
| 1 | 2017-07-17 12:00:00 | 2017-07-17 14:00:00 |
| 2 | 2017-07-17 8:00:00 | 2017-07-17 11:00:00 |
| 3 | 2017-07-17 13:00:00 | 2017-07-17 15:00:00 |
+-----+---------------------+---------------------+
假设我想 get records that overlap 12:00:00 -> 14:00:00
(其中 12->14 是 目标)。
本质上,对 (RecordStart <= TargetEnd) and (RecordEnd >= TargetStart)
有效的记录我可以使用以下其中一项来做到这一点:
1- sql 语句中的条件:
const myQuery =
"SELECT * FROM myTable " +
"WHERE start_date <= '" + target_end_date +
"' AND '" + target_start_date + "' <= end_date";
let filtered = DbConnection.query(myQuery)
2-代码中的条件:
const myQuery = "SELECT * FROM myTable";
let records = DbConnection.query(myQuery)
let filtered = [];
records.map((rec) => {
if(Date.parse(rec.start_date) <= Date.parse(target_end_date) && Date.parse(target_start_date) <= Date.parse(rec.end_date) )
filtered.push_back(rec)
})
我应该遵循哪种做法?
更一般地说,选择最佳实践是面向案例的?这是否取决于数据库有多大 and/or 结果会有多大?或者有一些我还不知道的关于sql vs code的知识?
作为程序员,我是否为每个用例构建两种方法并进行测试然后选择?
编辑:
考虑到每个 processing-related/querying 事情都会发生在 API 端,然后 filtered
(这两种方法的最终结果相同)将通过网络发送返回给客户。
利用 Sql 功能进行过滤将是: - 性能 - 减少网络带宽使用 - 可维护 - 快速实施 ETC 毕竟Database是用来存储数据和进行CRUD操作的
使用 sql 过滤记录有两个原因。一是减少流经网络的数据量。第二个是尽量减少应用程序所需的 RAM 量。如果您引入太多数据,您可能会遇到堆 space 问题。
这里有两点需要考虑:
- 尽可能提取最小、最有效的结果集
- 尽可能少地访问数据库
您几乎总是希望专注于提取尽可能小、最高效的结果集。 IE。在 SQL.
中进行过滤唯一应该在代码而不是 SQL 查询中过滤的情况是,如果您已经 需要 将整个 table 拉入内存并且稍后将过滤以不同方式查看它。