首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FoundationDB -通过键值层插入数据并通过SQL层读取.有可能吗?

FoundationDB -通过键值层插入数据并通过SQL层读取.有可能吗?
EN

Stack Overflow用户
提问于 2014-05-06 13:55:10
回答 1查看 485关注 0票数 0

我试图在某些特定的应用程序中使用FoundationDB,因此,我请求关于我无法解决的问题的一些帮助,或者找到任何有关的信息。

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

所以问题是-这有可能吗?你能帮我提供任何信息吗?或者至少告诉我去哪里找(我自己找不到任何简短的信息)?

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

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

谢谢你的帮助!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-05-07 13:49:20

即使你不让我这样做,我还是要给你一个警告:这条路上有龙!

可以这样想:要编写总是SQL层所期望的数据,就必须重新实现SQL层。

学术示范如下:)

盯着桌子和一排:

代码语言:javascript
复制
CREATE TABLE test.t(id INT NOT NULL PRIMARY KEY, str VARCHAR(32)) STORAGE_FORMAT tuple;
INSERT INTO test.t VALUES (1, 'one');

Python读取当前并添加一个新行:

代码语言:javascript
复制
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读取数据:

代码语言:javascript
复制
test=> SELECT * FROM t;
 id | str
----+-----
  1 | one
  2 | two
(2 rows)

这里发生了什么:

  • 使用STORAGE_FORMAT选项以元组的形式创建具有键值和值的表
  • 插入一行
  • 导入和打开FDB
  • 打开表的目录
  • 扫描所有行并解包以进行打印
  • 通过创建包含期望值的元组来添加新行

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

  • 目录前缀
  • 表的序号,SQL层表组中的标识符。
  • 主键的值。

该值包含表中的列,按声明的顺序排列。

现在我们已经有了一个简单的概念证明,下面有几个原因说明了为什么这样做很难使您的数据正确:

  • 没有检查模式生成、元数据和数据格式版本。
  • 主键没有维护,仍然是“内部”格式
  • 没有需要维护的辅助索引
  • 表组中没有要维护的其他表(例如,测试表是单个表组)
  • 忽略了在线DDL,这(基本上)是DML期间要做的工作量的两倍。

还需要注意的是,这些警告仅用于编写您希望通过SQL层访问的数据。相反,读取SQL层编写的数据要容易得多,因为它不需要担心这些问题。

希望这能给你一个范围的感觉!

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23496729

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档