0

我们正在使用 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(我猜这效率很低)。

为这种应用程序使用基于文档的数据库是个坏主意吗?如果没有,我们如何改进我们的模式以使其尽可能高效?

干杯,对不起文字墙:-)

4

1 回答 1

0

老实说,除非您的数据的某些部分完全是非结构化的,否则我认为没有必要为您的问题使用 NoSQL 解决方案。我的观点是你确实有数据库知识,所以你熟悉 MySQL/PostgreSQL/etc。我真诚地相信 PostgreSQL(或 Mysql)会更容易让您设置、编写代码、维护并可能最终扩大规模。我对 NoSQL 的看法是,当您拥有非结构化数据集并且需要动态添加字段的灵活性时使用它,使用 MongoDB 存在缺陷。这不是银弹。

一些陷阱是,例如,in()s 很慢,如果你向 mongo 写了一些东西然后想立即阅读它,你不得不期望你不会得到它(在 mongo 中分片),map reduce 有点麻烦(我没有尝试过聚合框架,Moped但它看起来很有希望,有时索引可能会出现分片集合的问题)。

于 2013-02-25T21:57:04.770 回答