我打算为我的应用程序使用缓存层。我不确定定义 1..N 和 self 参照关系的正确策略是什么。
例如,如果我必须代表类(class)和学生,一门类(class)可以注册 1..N 名学生。我还必须维护彼此相关的不同类(class)之间的关系(一门类(class)可以链接到其他类似类(class))。
我想我有两个选择:
我可以拥有一个包含学生 ID 和相关类(class) ID 列表的类(class)模型。我现在将类(class)作为散列存储在 redis 中。每当将学生添加到列表中时,我都可以从缓存中获取类(class),进行更改并将其放回缓存中。
我可以对仅具有类(class)基本属性的类(class)进行建模。我现在可以使用 Redis 列表表示与学生和其他类(class)的关系。
哪种方法更好?为什么?
如果删除类(class),我必须删除所有关联关系。我怎样才能做到这一点?
最佳答案
我认为如果您要使用 Redis,您需要重新考虑您的解决方案。避免像在关系数据库中那样考虑关系。
在 Redis 中,您既可以将完整的对象存储为 JSON 或任何其他序列化格式,也可以存储在列表、集合、排序集合和哈希等数据结构中。
整个关联不会由 Redis 执行,而是由您的应用程序层执行,但我再次建议您应该重新考虑如何在 Redis 中存储数据。
例如,如果您有类(class)和学生,您可以以不相关的方式将两者存储在 redis 中:
- 学习中心:类(class):123
- 学习中心:学生:1129
如果您需要将学生添加到给定类(class),您将创建一个集合类型的键:
- 学习中心:类(class):123:学生
...您将存储学生唯一标识符的位置,例如:
sadd learningcenter:course:123:students 1129
归根结底,course
有 N 个students
,但这在 Redis 中无法很好地表示:这是您的代码在整个 Redis 中存储数据的方式数据库。
关键是拥有这样的一组唯一标识符,以确保您将它们分布在整个数据库中,而不会有添加对某些数据的不存在引用的风险。
当您需要添加新学生并将其关联到一门或多门类(class)时,您需要自己执行整个 sadd
命令,而当您想要删除学生时,您您需要确保从任何集合中删除它的 key 。
Redis 支持事务
You should take a look at how Redis handles transactions,因为您需要以原子方式执行此类写入操作以避免数据损坏。
关于Redis 和关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24470861/