我们正在使用带有Mongoid的Ruby on Rails创建一个应用程序。
我一直在阅读mongoDB和Mongoid的文档,了解如何在使用基于文档的数据库时设计数据库模式。我已经在脑子里探讨了一段时间了,并且非常感谢有经验的人提供的一些意见,我知道我是否完全迷失了:p
Anywho,这是我们正在制作的应用程序的概述(我试图尽可能简单地保持问题):
该应用程序由以下实体组成:
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(我猜这是相当低效的)
对这种应用程序使用基于文档的数据库是个坏主意吗?如果没有,我们如何改进我们的架构以使其尽可能高效?
干杯,对不起文字墙: - )
答案 0 :(得分:0)
我诚实地认为,除非你的数据的某些部分完全是非结构化的,否则我认为没有必要为你的问题使用NoSQL解决方案。 我是从你拥有数据库知识的角度出发,所以你熟悉MySQL / PostgreSQL /等。 我真诚地相信PostgreSQL(或者Mysql)会更容易设置,编写代码,维护并最终扩展。 我对NoSQL的看法就是在你有非结构化数据集时使用它,你需要灵活地添加字段,使用MongoDB存在缺陷。 这不是一颗银弹。
有些陷阱是,例如,in()
s很慢,如果你写一些东西给mongo然后想立即读它,你必须期望你不会得到它(在mongo中分片), map reduce是一种麻烦(我没有尝试使用Moped
的聚合框架,但它确实看起来很有希望,有时索引可能会出现分片集合的问题。)