在我的对象表中我有
id | type | parent | order | created
然后在我的数据表中我有
object_id | key | value
我希望以最佳方式得到'x'类型的对象,其中键'y'==='z'。
即。让用户在slug ==='jonny'
我目前正在使用连接,因为我在mysql中这样做是一个快速测试。但我会转向redis或类似的键/值存储系统,显然不会起作用。
答案 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