【发布时间】:2014-10-12 19:37:53
【问题描述】:
问题
我有一个数据库(SQLite 或 MySQL),其中包含过去几年中每天的降雨量值。很简单:
date | rain
------------------------
"2014-10-20" 3.3
每天,我都会从当地气象局提取一个 CSV 文件。他们只发布包含全年数据的 CSV 文件,没有每日/每周/等文件,因此到年底文件中有 365 行。在每一行中,日期分为年、月和日字段。
所以当需要在数据库中存储信息时,我有两个选择。
解决方案 1:进行日期比较
我会将上次运行程序的日期保存在数据库或文本文件中。我使用Date.strptime 解析该日期并将其存储为last_run_time。然后我用CSV.read('raindata.csv').each do |row| 加载CSV 文件,对于每一行,我用rowdate = Date.strptime("#row[2]}-#{row[3]}-#{row[4]}") 将三个日期字段解析为一个新的Date 对象,然后说if rowdate > last_run_time then 将信息插入数据库。
这样,我避免了对我已有的值进行数据库调用来插入或替换值。到今年年底,这让我免去了 364 次数据库查询,但这意味着我做了很多日期解析和比较。
方案二:让数据库处理就行了
我会避免所有这些,只说对于 CSV 中的每一行,插入或忽略到数据库中。数据库中的日期字段是唯一的,因此如果我尝试插入但已经有了日期,它只会忽略查询。优点:避免进行日期比较和解析,缺点:对数据库进行多达 364 次不必要的点击。
问题
这两种解决方案中哪一种更智能、更高效、更节省资源?进行不必要的数据库查询并节省 CPU 是否更好,反之亦然?
【问题讨论】:
-
为了节省 0.1 秒的 CPU 时间,你愿意牺牲多少编程时间?
标签: mysql ruby-on-rails ruby sqlite