2012-10-05 52 views
20

Creo que estoy tratando de implementar una tabla de id. Básicamente tiene la estructura (user_id, lecturer_id) which user_id se refiere a la clave principal en mi tabla de usuario y lecturer_id se refiere a la clave principal de la tabla de mi profesor.Buscar clave por valor

estoy tratando de implementar esto en Redis, pero si me puse la llave como identificación primaria del usuario, cuando trato de ejecutar una consulta como obtener todos los registros con el profesor de id = 5 desde el conferenciante no es la clave, pero valor No podré alcanzarlo en O (1) vez.

¿Cómo puedo formar una estructura como la tabla de identificación que mencioné anteriormente, o Redis no es compatible con eso?

+0

Una página recientemente agregada en la documentación de Redis proporciona más información sobre [Indexación secundaria con Redis] (http://redis.io/topics/indexes), y cubre este caso bajo [Índices numéricos simples con conjuntos ordenados] (http://redis.io/topics/indexes#simple-numerical-indexes-with-sorted-sets) sección. –

Respuesta

28

Una de las cosas que se aprenden rápido mientras se trabaja con Redis es que se llega a diseñar la estructura de datos en torno a sus necesidades con el acceso, especialmente cuando se trata de las relaciones (que no es una base de datos relacional, después de todo)

Hay no hay forma de buscar por "valor" con una complejidad de tiempo O (1) como ya has notado, pero hay formas de acercarte a lo que describes usando redis. Esto es lo que yo recomendaría:

  • almacenar sus datos de usuario por ID de usuario (por ejemplo, en un hash) como ya lo están haciendo.
  • Disponen de un conjunto adicional para cada id de conferenciante que contenga todos los ID de usuario que correspondan al ID del profesor en cuestión.

Esto podría parecer como la duplicación de los datos de la relación, ya que sus datos de usuario tendrían que almacenar el identificador de conferencia, y sus datos de clase almacenarían los identificadores de usuario, pero esa es la (pequeña) precio a pagar si uno está para construir relaciones en un data store no relacional como redis. En términos prácticos, esto funciona bien; la memoria rara vez es un cuello de botella para conjuntos de datos pequeños (piense en miles de ids).

Para tener una mejor idea de cómo son las personas que utilizan Redis para modelar aplicaciones con las relaciones, recomiendo la lectura Design and implementation of a simple Twitter clone y el código fuente de Lamernews, ambos de los cuales están escritos por el autor Redis Salvatore Sanfilippo.