Database Design + Rails与:通过使用元数据相关联

时间:2011-09-19 16:28:11

标签: ruby-on-rails-3 database-design activerecord data-modeling

以下是该场景:我正在构建一个允许用户根据他们的技能集互相搜索的系统。

  • 用户有技能。技能是通用对象,并在用户之间共享。
  • 用户拥有与技能相关的以下元数据:级别和兴趣
  • 每个用户都可以创建自己的类别,在这些类别下,他们可以组织他们的技能(例如,一个用户可能拥有“前端开发”下的“Saas”技能和“Web开发”下的另一个技能)

我有4个表:用户,技能,类别&技能组

假设John Doe(用户名:“johndoe”)具有以下类别和技能组合:

类别:前端 技能:HAML,SASS / SCSS,CoffeeScript,Javascript,jQuery

类别:后端 技能:Ruby,Ruby on Rails,node.js

我希望能够执行以下操作:

user = User.where(:username => "johndoe").first

user.categories
# returns a list of the user's categories

user.skills
# returns a list of the user's skills

user.category.where(name => "Front-End").first.skills
# => returns list of skills in the "Front-End" category

user.skills.where(:name => "HAML").first.category
# returns "Front-End" category

# adds a skill without assigning it to a category
user.skills << skill_object
user.skills.last.level = 9
user.skills.last.interest = 6
user.skills.last.save

# adds a skill while assigning it to a category
user.category.skills << skill_object
user.category.skills.last.level = 9
user.category.skills.last.interest = 6
user.category.skills.last.save

为了按技能找到用户:

skill = Skill.where(:name => "Javascript").first

skill.users
# returns users possessing skill

我一直在玩我的模特一段时间,但并没有像我希望的那样表现得很好。我需要一个全新的视角 - 任何指针/建议?

1 个答案:

答案 0 :(得分:0)

我对Ruby一无所知,但从关系数据库的角度来看,我可能只为每个用户创建一个特殊的,硬编码的类别字段:Uncategorized

然后,当您添加技能时,他们要么进入指定的类别,要么为该用户默认未分类。除了每个用户的一个“特殊”记录之外,无论您正在查看哪种技能或类别,其他所有内容都将完美运行,您可以将所有约束保留在原位,而无需担心空值。

UserID, User
1, me

CategoryID, UserID, Category
1,1,Uncategorized
2,1,Web GUI

SkillID, Skill
1,Javascript
2,Knitting

SkillID, CategoryID, Level, Interest
1,2,10,75
2,1,50,1

根据您使用Level和Interest的方式,我还考虑将它们设置为查找表,以便从数据库角度为值赋予意义(并帮助填充下拉列表)。 等