我们正在使用 Ruby on Rails 和 Mongoid 制作一个应用程序。
我一直在阅读 mongoDB 和 Mongoid gem 的文档,了解如何在使用基于文档的数据库时设计数据库模式。我已经在脑海中思考了一段时间,并且非常感谢比我更有经验的人的一些意见,以知道我是否完全迷失了:p
任何人,这是我们正在制作的应用程序的概述(我试图使其尽可能简单以保持问题的真实性):
该应用程序由以下实体组成:
Users, Subjects, Skills, Tasks, Hints and Tutorials.
它们按以下方式组织:
Subjects consists of a set of 1..n Skills.
Skills consists of a set of Tasks, (sub-)Skills or both (i.e. skills can be a tree
structure, where one main skill (say, Geometry) is the root and other skills are
child nodes (for instance, the Pythagorean Rule might be a sub-skill)). However,
all skills, regardless of whether they have sub-skills or not, should consist of
0..n tasks.
Tasks have a set of 1..n Hints associated with them.
Hints are each associated with a particular task.
Tutorials are associated with 1..n Skills (this skill can be either a root
node or a leaf node in a skill tree).
Users can complete 0..n Tasks in order to complete 0..n Skills.
现在,我们想象将主要有读取查询调用数据库以收集某些用户完成的技能/任务,并读取查询以显示与主题相关的各种技能树。主要的写查询可能会与各种用户和任务之间的关系有关,形式如下
User A completes Task B
等等。此外,我们假设实体数量的大小如下:用户 > 提示 > 任务 > 技能 > 教程 > 主题
目前,这是我们想到的解决方案:
Subject.rb
has_and_belongs_to_many :skills
Skill.rb (uses Mongoid::Tree)
has_and_belongs_to_many :subjects
embeds_many :tasks
Task.rb
embedded_in :skill, :inverse_of => :tasks
embeds_many :hints
Hint.rb
embedded_in :task, :inverse_of => :hints
我们还没有真正开始实施教程以及用户和技能/任务之间的联系,但我们认为用户和技能/任务之间的关系必须是 N:N(我猜这效率很低)。
为这种应用程序使用基于文档的数据库是个坏主意吗?如果没有,我们如何改进我们的模式以使其尽可能高效?
干杯,对不起文字墙:-)