FoundationDB - 通过键值层插入数据并通过SQL层读取它。可能吗?

时间:2014-05-06 13:55:11

标签: foundationdb nosql

我试图将FoundationDB用于某些特定的应用程序,因此我要求对我无法解决的问题提供一些帮助,或者找不到任何相关信息。

问题是,在应用程序中,我必须通过SQL层(特别是ODBC驱动程序)读取数据。不过,我可以,甚至我更喜欢用标准键值层插入数据(而不是通过SQL层)。

所以问题是 - 有可能吗?你能帮我提供任何信息,或者至少指出我在哪里寻找它(我自己没有找到任何简短的信息)?

我相信通过SQL层插入数据可能效率较低,这看起来很容易理解(因为数据库本身不是SQL),或者我在这里错了?

请不要关注这种方法的合理性,因为这是一个实验性的学术项目:)。

感谢您的帮助!

1 个答案:

答案 0 :(得分:3)

即使你不这样做,我也要发出一个大警告:这条道路上有龙!

以这种方式思考:要编写始终如SQL Layer所期望的数据,必须重新实现SQL层

学术示范如下:)

凝视桌子和行:

CREATE TABLE test.t(id INT NOT NULL PRIMARY KEY, str VARCHAR(32)) STORAGE_FORMAT tuple;
INSERT INTO test.t VALUES (1, 'one');

Python读取当前内容并添加新行:

import fdb
import fdb.tuple
fdb.api_version(200)
db = fdb.open()
# Directory for SQL Layer table 'test'.'t'
tdir = fdb.directory.open(db, ('sql', 'data', 'table', 'test', 't'))
# Read all current rows
for k,v in db[tdir.range()]:
    print fdb.tuple.unpack(k), '=>', fdb.tuple.unpack(v)
# Write (2, 'two') row
db[tdir.pack((1, 2))] = fdb.tuple.pack((2, u'two'))

最后,从SQL中读取数据:

test=> SELECT * FROM t;
 id | str
----+-----
  1 | one
  2 | two
(2 rows)

这里发生了什么:

  • 使用STORAGE_FORMAT选项
  • 创建一个包含键和值作为元组的表
  • 插入行
  • 导入并打开FDB
  • 打开表格的Directory
  • 扫描所有行并解压缩以进行打印
  • 通过创建包含预期值
  • 的元组添加新行

密钥包含三个组件(类似(230, 1, 1)):

  • 目录前缀
  • 表的序数,SQL层中的标识符Table Group
  • PRIMARY KEY的值

该值包含表中的列,按照它们的声明顺序。

现在我们有一个简单的概念证明,这里有一些极少数理由说明为什么这对于保持数据正确具有挑战性:

  • 未检查架构生成,元数据和数据格式版本
  • PRIMARY KEY未维护且仍处于“内部”格式
  • 无需维护二级索引
  • 表组中没有其他表要维护(即测试表是单个表组)
  • 忽略了在线DDL,它(基本上)在DML期间完成的工作量增加了一倍

同样重要的是要注意,这些注意事项仅适用于您希望通过SQL层访问的写入数据。 SQL Layer编写的反向读取数据更容易,因为它不必担心这些问题。

希望这能让你了解范围!