我正在寻求实现一个数据库解决方案,以支持对一组简单的 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
我需要的是一种简单地选择第 1 列、第 2 列或第 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,但我愿意接受建议。
最佳答案
您没有指定是否需要本地或远程访问数据存储。如果您需要远程访问,那么Redis可能是一个非常好的解决方案。如果您的访问纯粹是本地的,那么嵌入式数据库(例如 BerkeleyDB)可能会更有效。
要点是定义如何维护数据:新条目是否只能添加到数据结构的末尾?如果是,Redis 列表将飞来存储您的列。如果不是,那么将未排序的数据保留在每列的哈希对象(关联的条目和值)中可能会更好。如果条目数量较少,那么在客户端检索后对数据进行排序无论如何都是便宜的。
此设计类似于您在某些列式数据库中可以找到的实现。这种方法的主要好处是系统可以以高压缩比压缩给定列的值,这在数据量很大时很有趣。缺点是数据的实时维护比较困难。对于 MySQL 的示例,您可能需要查看 Infobright或Calpont产品。
就您的情况而言,如果数据量有限,Redis 是一个不错的选择。但请注意,当条目数量变得很大(即超过描述的阈值 here )时,这些数据在内存中的表示不会特别紧凑(涉及指针、双链表和/或哈希表)。
关于database - 排序键/值数据库解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12366912/