0

我正在尝试将 FoundationDB 用于某些特定应用程序,因此我正在寻求有关我无法解决或找不到任何信息的问题的帮助。

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

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

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

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

感谢您的任何帮助!

4

1 回答 1

3

即使你要求不要,我也要给一个大大的警告:这条路有龙!

可以这样想:要编写始终如 SQL 层所期望的数据,您将不得不重新实现 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
  • 打开表的目录
  • 扫描所有行并打开包装进行打印
  • 通过创建包含预期值的元组来添加新行

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

  • 目录前缀
  • 表的序号,SQL 层表组内的标识符
  • PRIMARY KEY 的值

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

现在我们有了一个简单的概念证明,以下是保持数据正确性具有挑战性的几个原因:

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

还需要注意的是,这些注意事项仅适用于编写要通过 SQL 层访问的数据。相反,读取SQL 层写入的数据要容易得多,因为它不必担心这些问题。

希望这能让您了解范围!

于 2014-05-07T13:49:20.417 回答