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"
надеюсь, что это поможет как обходной путь :-)