我打算为我的应用程序使用缓存层。我不确定定义1..N和自引用关系的正确策略是什么。
例如,如果我必须代表课程和学生,一门课程可以让1..N学生注册。我还必须保持彼此相关的不同课程之间的关系(课程可以与其他类似课程相关联)。
我想我有两个选择:
我可以拥有一个课程模型,其中包含学生ID和相关课程ID的列表。我现在将课程存储为redis中的哈希。每当学生被添加到列表中时,我都可以从缓存中获取课程,进行更改并将其放回缓存中。
我可以为具有该课程基本属性的课程建模。我现在可以使用Redis列表来表示与学生和其他课程的关系。
哪种方法更好?为什么?
如果删除课程,我必须删除所有相关关系。我怎样才能做到这一点?
答案 0 :(得分:1)
如果您打算使用Redis,我相信您需要重新考虑您的解决方案。避免像在关系数据库中那样考虑关系。
在Redis中,您既可以将完整对象存储为JSON或任何其他序列化格式,也可以存储在列表,集合,有序集和哈希等数据结构中。
整个关联不会由Redis强制执行,而是由您的应用程序层强制执行,但我建议您再次考虑如何在Redis中存储数据。
例如,如果您有课程和学生,您可以以不相关的方式存储在redis中:
如果您需要将学生添加到指定课程,您可以创建一个 set 类型的键:
...您可以存储学生的唯一标识符,例如:
sadd learningcenter:course:123:students 1129
在一天结束时,course
有N students
,但在Redis中无法很好地表示:这是您的代码在整个Redis数据库中存储数据的方式。
关键是拥有这样的唯一标识符集,以确保您将它们分布在整个数据库中,而不存在添加对某些数据的未引用引用的风险。
当您需要添加新学生并将其与一个或多个课程相关联时,您需要自己完成整个sadd
命令,当您想要删除学生时,您需要确保从任何一组中删除其密钥。
You should take a look at how Redis handles transactions,因为您需要以原子方式执行此类写操作以避免数据损坏。