在我的对象表中
id | type | parent | order | created
然后在我的数据表中
object_id | key | value
我想以最优化的方式获得'x'类型的对象,其中键'y' ==='z'。
IE。获取 slug === 'jonny' 的用户
我目前正在使用连接进行操作,因为我在 mysql 中这样做是为了快速测试。但我将转向 redis 或类似的键/值存储系统,所以显然这行不通。
在我的对象表中
id | type | parent | order | created
然后在我的数据表中
object_id | key | value
我想以最优化的方式获得'x'类型的对象,其中键'y' ==='z'。
IE。获取 slug === 'jonny' 的用户
我目前正在使用连接进行操作,因为我在 mysql 中这样做是为了快速测试。但我将转向 redis 或类似的键/值存储系统,所以显然这行不通。
您无法将关系模型调整或转换为键值存储:您需要在术语或结构以及访问路径方面重新考虑您的数据模型。
在您的示例中,使用 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