Как иметь отношения многие ко многим в redis

в реляционной базе данных, у меня есть таблица пользователя, таблица категорий и таблица категорий пользователей, которые выполняют многие и многие отношения. Какая лучшая форма имеет эту структуру в redis?

Ответ 1

С Redis отношения обычно представлены наборами. Набор может использоваться для представления односторонних отношений, поэтому вам нужно, чтобы один набор на объект представлял отношение "многие ко многим".

Бесполезно пытаться сравнить модель реляционной базы данных с структурами данных Redis. С Redis все хранится в денормализованном виде.

Пример:

# Here are my categories
> hmset category:1 name cinema  ... more fields ...
> hmset category:2 name music   ... more fields ...
> hmset category:3 name sports  ... more fields ...
> hmset category:4 name nature  ... more fields ...

# Here are my users
> hmset user:1 name Jack   ... more fields ...
> hmset user:2 name John   ... more fields ...
> hmset user:3 name Julia  ... more fields ...

# Let establish the many-to-many relationship
# Jack likes cinema and sports
# John likes music and nature
# Julia likes cinema, music and nature

# For each category, we keep a set of reference on the users
> sadd category:1:users 1 3
> sadd category:2:users 2 3
> sadd category:3:users 1
> sadd category:4:users 2 3

# For each user, we keep a set of reference on the categories
> sadd user:1:categories 1 3
> sadd user:2:categories 2 4
> sadd user:3:categories 1 2 4

Как только мы получим эту структуру данных, ее легко запросить с помощью алгебры множеств:

# Categories of Julia
> smembers user:3:categories
1) "1"
2) "2"
3) "4"

# Users interested by music
> smembers category:2:users
1) "2"
2) "3"

# Users interested by both music and cinema
> sinter category:1:users category:2:users
1) "3"

Ответ 2

IMHO Redis не для создания структурированных запросов (SQL), а для быстродоступных данных, что вы можете сделать: сделайте "таблицу" с user_id как ключ, а данные - это список с друзьями, например. Затем вы запрашиваете user_id и обрабатываете то, что вам нужно. Это противоположность нормализации. Если порядок данных важен, например, обновления статуса, то, что вы делаете, - это данные push и pop в списки. Например, таблица "status" имеет user_id как ключ, а данные - это список. Вы lpush данные, а затем, например, запрашиваете последние 20 элементов.