FoundationDB - вставка данных через слой ключ-значение и чтение через SQL-слой. Является ли это возможным?

Я пытаюсь использовать FoundationDB для какого-то конкретного приложения, поэтому прошу помощи по проблеме, которую не могу решить, или не могу найти какую-либо информацию.

Дело в том, что в приложении я ДОЛЖЕН читать данные через уровень SQL (в частности, драйвер ODBC). Тем не менее, я могу или даже предпочел бы вставить данные со стандартным слоем ключ-значение (не через уровень SQL).

Так что вопрос - это возможно? Не могли бы вы помочь мне с какой-либо информацией или хотя бы указать мне, где ее искать (я сам не смог найти какую-либо краткую информацию)?

Я полагаю, что вставка данных через уровень SQL, вероятно, менее эффективна, что кажется довольно понятным (поскольку сама БД не-SQL), или, может быть, я здесь не прав?

Давайте не будем останавливаться на разумности такого подхода, пожалуйста, так как это экспериментальный академический проект:).

Спасибо за любую помощь!

1 ответ

Решение

Даже если вы просили не делать этого, я должен предупредить вас: на этом пути будут драконы!

Подумайте об этом так: чтобы записывать данные, которые всегда соответствуют уровню 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
  • Значение ПЕРВИЧНОГО КЛЮЧА

Значение содержит столбцы в таблице в порядке их объявления.

Теперь, когда у нас есть простое доказательство концепции, вот несколько причин, почему сложно сохранить правильность ваших данных:

  • Генерация схемы, метаданные и версии формата данных не проверялись
  • ПЕРВИЧНЫЙ КЛЮЧ не был сохранен и все еще находится во "внутреннем" формате
  • Нет вторичных индексов для обслуживания
  • Нет других таблиц в группе таблиц для поддержки (т. Е. Тестовая таблица является одной группой таблиц)
  • Онлайн DDL был проигнорирован, что (в основном) удваивает объем работы, выполняемой во время DML

Также важно отметить, что эти предостережения предназначены только для записи данных, к которым вы хотите получить доступ через уровень SQL. Обратное чтение данных, записанное SQL Layer, намного проще, так как не нужно беспокоиться об этих проблемах.

Надеюсь, что это дает вам ощущение объема!

Другие вопросы по тегам