SQL JOIN в Redis (модуль FT или другие решения)

Хочу перенести часть SQL- запросов в redis и столкнулся с проблемой, что у redis нет аналога функционала

Пример на SQL. Получилось 2 таблицы:

      CREATE TABLE `games` (
    `id` MEDIUMINT(8) UNSIGNED NOT NULL DEFAULT '0',
    `fname` CHAR(64) NOT NULL DEFAULT '',
    ...
);

CREATE TABLE `log` (
    `id` MEDIUMINT(8) UNSIGNED NOT NULL DEFAULT '0',
    `fgame_id` CHAR(64) NOT NULL DEFAULT ''
    `finfo` MEDIUMTEXT NOT NULL
    ...
);

Хотите получить название игры по идентификатору игры:

      SELECT log.fgame_id, games.fname, log.finfo
FROM log
LEFT JOIN games ON games.id = log.fgame_id

В Redis я создал индекс с теми же именами и похожей структурой:

      FT.CREATE games
  ON HASH
    PREFIX 1 "games:"
  SCHEMA
    id        TAG SORTABLE
    fname     TEXT SORTABLE


FT.CREATE log
  ON HASH
    PREFIX 1 "log:"
  SCHEMA
    id        TAG SORTABLE
    fgame_id  TEXT SORTABLE
    finfo     TEXT NOINDEX

Можно ли реализовать SQL JOINметод в REDIS(FT.SEARCH/FT.AGGREGATE)?

1 ответ

Нет поддержки ПРИСОЕДИНЕНИЯ прямо из Redis с помощью поиска. Следуя вашему примеру, вы можете использовать два разных ПРЕФИКСА для сопоставления разных таблиц данных (игры: и журнал:). Например:

      FT.CREATE idx ON HASH PREFIX 2 "games:" "log:" SCHEMA "id" as id TAG "text" as text TEXT "price" as price NUMERIC

и добавление данных с использованием общего ключа:

      HSET games:1 id 1000 text IndianaJones
HSET games:2 id 2000 text Starwars

HSET log:1 id 1000 price 199
HSET log:2 id 2000 price 399

наконец, используя FT.AGGREGATE для возврата объединенной таблицы, например:

      FT.AGGREGATE idx "@id:{1000}" LOAD 2 @text @price
1) "1"
2) 1) "text"
   2) "IndianaJones"
3) 1) "price"
   2) "199"

надеюсь, что это поможет как обходной путь :-)

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