0

在我的对象表中

id | type | parent | order | created

然后在我的数据表中

object_id | key | value

我想以最优化的方式获得'x'类型的对象,其中键'y' ==='z'。

IE。获取 slug === 'jonny' 的用户

我目前正在使用连接进行操作,因为我在 mysql 中这样做是为了快速测试。但我将转向 redis 或类似的键/值存储系统,所以显然这行不通。

4

1 回答 1

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
于 2012-09-04T12:07:00.140 回答