операция реляционного типа в хранилище значений ключа

в моей таблице объектов у меня есть

id | type | parent | order | created

а затем в моей таблице данных у меня есть

object_id | key | value

Я хочу получить объект типа 'x', где ключ 'y' === 'z' наиболее оптимальным способом.

т.е. получить пользователя, где slug === 'jonny'

В настоящее время я делаю это с соединениями, потому что я делаю это в mysql в качестве быстрого теста. но я перейду на Redis или аналогичную систему хранения ключей / значений, поэтому очевидно, что это не сработает.


person Wayne Ashley Berry    schedule 04.09.2012    source источник
comment
Если ваша модель данных реляционная, почему бы вам не остаться с MySQL?   -  person Simon    schedule 04.09.2012


Ответы (1)


Вы не можете адаптировать или преобразовать реляционную модель в хранилище «ключ-значение»: вам необходимо переосмыслить свою модель данных в терминах или структуре, а также в терминах пути доступа.

В вашем примере с Redis я бы использовал:

  • один хэш для каждого объекта, содержащий как статические (тип, родительский, порядок, созданный), так и динамические (те, которые вы сохранили в таблице данных) свойства

  • один набор для каждого типа объектов для индексации типов объектов

  • один набор для каждого значения свойства, по которому нужно искать

В хранилище ключей и значений без схемы нет необходимости разделять статические и динамические свойства, как в случае с MySQL.

Поиск может быть выполнен путем пересечения множеств. Наборы необходимо поддерживать вручную (т.е. каждый раз, когда вы добавляете / удаляете объект, вам необходимо обновлять соответствующие наборы).

Получив результат поиска, соответствующие свойства объекта можно получить путем конвейерной обработки нескольких команд hgetall или с помощью команды sort.

Пример:

# Add 3 objects and their properties
hmset obj:1 type user parent nil order 1 created 20120901 key_slug jonny key_tag dummy key_author Bob
hmset obj:2 type user parent nil order 2 created 20120901 key_slug jonny key_tag not_dummy key_author Dan
hmset obj:3 type admin parent nil order 3 created 20120901

# Add type index
sadd type:user 1 2
sadd type:admin 3

# Add dynamic properties indexes
sadd key_slug:jonny 1 2
sadd key_tag:dummy 1
sadd key_tag:not_dummy 2
sadd key_author:Bob 1
sadd key_author:Dan 2

# Find objects whose type is user, author is Bob and slug is jonny
sinter type:user key_author:Bob key_slug:jonny

# Find properties of object 1
hgetall obj:1
person Didier Spezia    schedule 04.09.2012