我正在寻求实现一个数据库解决方案,以支持在一组简单的2D数据集上进行非常快速的基于列的访问。即考虑此数据集
==========================================================
SOME DATASET1
==========================================================
ENTRY | Col1 | Col2 | Col3 ... Coln
----------------------------------------------------------
ENTRY A 1.1 0.2 5.5 6.2
ENTRY B 2.3 6.4 1.5 1.1
ENTRY C 2.2 4.2 9.5 3.4
ENTRY D 2.3 1.1 5.5 2.9
ENTRY E 9.1 3.6 7.5 2.6
我需要的是一种简单地选择column1,column2或column n中所有值的方法,同时保留排序顺序。我最初的想法是使用redis,使用以下键空间设计:
SOMEDS1/COLUMNS/ => Col1, Col2, Col3 ... Coln
SOMEDS1/ENTRIES/ => A, B, C, D, E
SOMEDS1/Col1/ => 1.1, 2.3, 2.2, 2.3, 9.1
SOMEDS1/Coln/ => ......
这种设计背后的原理是每个列表中的条目数量不大,可能< 10,000但可能有很多列,并且在给定时间只需要选定的列。
我的问题是有没有人已经实现了这样的任何事情,如果有的话,你可以就最合适的数据库类型提出建议。我最初的想法是使用redis,但我愿意接受建议。
答案 0 :(得分:1)
我将数据存储在Redis中,如下所示:
的字符串:
Entry:A:Col1 => 1.1
Entry:A:Col2 => 0.2
Entry:A:Col3 => 5.5
...
Entry:A:ColN => 6.2
您可以使用无限数量的列(受物理内存限制)
答案 1 :(得分:0)
您没有指定是否需要对数据存储进行本地或远程访问。如果您需要远程访问,那么Redis可能是一个非常好的解决方案。如果您的访问纯粹是本地访问,那么嵌入式数据库(例如BerkeleyDB)可能会更有效。
重点是定义数据的维护方式:只能在数据结构的末尾添加新条目吗?如果是,Redis列表将飞行以存储您的列。如果没有,那么将每个列的散列对象(关联的条目和值)中的数据保持未分类可能更好。如果条目数量很少,那么在客户端检索后对数据进行排序也很便宜。
此设计类似于您可以在某些列式数据库中找到的实现。这种方法的主要好处是系统可以压缩具有高压缩比的给定列的值,这在数据量很大时很有意义。缺点是难以实时维护数据。对于MySQL的示例,您可能需要查看Infobright或Calpont个产品。
在您的情况下,如果数据量有限,Redis非常适合。但请注意,当条目数量变得显着时(即超过所描述的阈值here),这些数据在内存中的表示将不会特别紧凑(涉及指针,双链表和/或散列表)。