преобразовать структуру ключ / значение C ++ в базу данных (sqlite3) - PullRequest
0 голосов
/ 26 января 2012

У меня есть таблица ключей / значений в C ++, которая выглядит следующим образом:

class kvBucket {
   ...
   map<string, kvBucket*> buckets;
   map<string, string> keyPairs;
   ...
}
class kvTree {
   ...
   kvBucket base;
   ...
}

Я хотел бы преобразовать ее из структуры в памяти в структуру, реализованную в базе данных (sqlite3).Я не уверен, как представить схему из-за вложенных сегментов.Вот пример данных:

bucket | key | value
------   ---   -----
   a      v      1
  a/b     w      2
  a/b     x      3
 a/b/c    y      4
   d      z      5

В структуре C ++ у меня есть функции-члены, которые выполняют такие вещи, как получение списка сегментов в другом сегменте или получение списка пар ключ / значение по пути сегмента и т. Д.Мне нужно сделать то же самое с базой данных.Есть ли эффективный способ разработки схемы для этого?

1 Ответ

1 голос
/ 26 января 2012

Нет эффективного способа представления иерархических отношений в реляционном хранилище. Хранилища ключей-значений (вы, возможно, слышали о них, они все в моде в наши дни) лучше в этом, но, как правило, не предоставляют уровни SQL. Получение всех блоков по определенному пути потребует более одного запроса, если вы хотите иметь возможность перемещать сегменты (если вы не хотите перемещать сегменты когда-либо, вы можете использовать схему, которая у вас есть) и выполните поиск подстроки по имени сегмента для таких вещей, как "a/*").

Тем не менее, вы можете сделать это даже без того, чтобы каждое ведро сохраняло свой собственный полный путь: вам нужно отображение отношений «многие к себе» для многих из многих от bucket до bucket. Вам нужны две таблицы, одна для сегментов и одна только для отображения. В таблице сопоставления у вас есть два столбца, parent_bucket и child_bucket. В таблице bucket есть три: bucket_id, key и value.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...