我是一个相当有经验的 R 用户,但直到现在我还没有充分的理由学习使用数据库。现在我遇到了一个问题,我正在处理需要保存到磁盘的模型输出,然后查询另一个进程。如果数据更小,我会将所有内容存储在list
带有分层元素的 , 中。例如,如果我的对象被称为output.OLS
:
1> summary(output.OLS)
Length Class Mode
SEP0307 3 -none- list
SEP0308 3 -none- list
SEP0306 3 -none- list
SEN0308 3 -none- list
<<snip -- hundreds of sub-lists>>
SEN0307 3 -none- list
层次结构的第二层:
1> summary(output.OLS[[1]])
Length Class Mode
c1 11 -none- list
c2 11 -none- list
c2 11 -none- list
第三:
1> summary(output.OLS[[1]][[1]])
Length Class Mode
Baseline 1008 data.frame list
CanSEM45 1008 data.frame list
CanSEM85 1008 data.frame list
CCSM45 1008 data.frame list
CCSM85 1008 data.frame list
GISS45 1008 data.frame list
GISS85 1008 data.frame list
HadGEM45 1008 data.frame list
HadGEM85 1008 data.frame list
MIROC45 1008 data.frame list
MIROC85 1008 data.frame list
我们可以看到现在我们正在查看data.frame
s
1> dim(output.OLS[[1]][[1]][[1]])
[1] 33 1008
1> colnames(output.OLS[[1]][[1]][[1]])[1:10]
[1] "scen" "year" "region" "size" "amount" "mean"
[7] "semean" "varres" "result.1" "result.2"
<<snip>>
[1006] "result.998" "result.999" "result.1000"
有四个这样的输出对象,总共大约 6GB。他们并不都有列mean
,semean
并且varres
这个列表大约有 1.5 个演出,考虑到我想用它做什么,这很笨拙。从数据库中读取它的子集会好得多。我可以想到两种潜在的架构:
架构 1:单个、巨大的表变量名称将是region
(最外层的层次结构)、cx
(即:c1、c2、c3)、model
(基线、CanSEM 等),然后是所有结果:result.1, result.2, ..., result.1000
这将是最方便的。问题是桌子既深又宽。据我所知,对于最简单的数据库 SQLLite 来说太宽了。
架构二::一张keyvalue表,多张数据表。键值表将具有以下列:
cx, scenario, year, place, keyvalue = coerce_to_integer(unique(scenario, year, place, cx))
数据表看起来像这样
keyvalue, result_number, result
这个选项使用层次结构,实际上是一个关系数据库(通过键值关系,对吧)?
但它的缺点是它几乎将我的数据大小增加了三倍:对于每个数据,我需要存储一个键值和一个索引(result_number)。这似乎没有任何意义。
是否有其他选择
例如,是否有类似于 R 的数据库lists
可以存储在内存中并从内存中读取?这有点像 NoSQL 数据库吗?
所以,我的问题
- 什么样的数据库架构对这个问题有意义?
- 我应该从哪里开始学习这些类型的数据库?
- R如何与它们交互?我可以从 R 创建数据库吗?如果是这样,怎么做?