关键值存储的关系类型操作

时间:2012-09-04 09:36:41

标签: mysql redis key-value relational

在我的对象表中我有

id | type | parent | order | created

然后在我的数据表中我有

object_id | key | value

我希望以最佳方式得到'x'类型的对象,其中键'y'==='z'。

即。让用户在slug ==='jonny'

我目前正在使用连接,因为我在mysql中这样做是一个快速测试。但我会转向redis或类似的键/值存储系统,显然不会起作用。

1 个答案:

答案 0 :(得分: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