Проектирование баз данных + Rails ассоциируется с: через использование метаданных - PullRequest
0 голосов
/ 19 сентября 2011

Вот сценарий: я строю систему, которая позволит пользователям искать друг друга на основе их навыков.

  • У пользователей есть навыки.Навыки являются универсальными объектами и являются общими для пользователей.
  • Пользователи имеют следующие метаданные, связанные с навыками: уровень и интерес
  • Каждый пользователь может создавать свои собственные категории, в соответствии с которыми они могут организовывать свои навыки (например,у одного пользователя может быть навык "Saas" в разделе "Front-End Development", а у другого - в разделе "Веб-разработка")

У меня есть 4 таблицы: пользователи, навыки, категории и наборы навыков

Предполагая, что Джон Доу (имя пользователя: "johndoe") имеет следующие категории и набор навыков:

Категория: Внешние навыки: HAML, SASS / SCSS, CoffeeScript, Javascript, jQuery

Категория: Back-end Skills: 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 голосов
/ 19 сентября 2011

Я ничего не знаю о 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

В зависимости от того, как вы используете Уровень и Интерес, я бы также подумал о том, чтобы сделать их справочными таблицами, чтобы придать значение значениям с точки зрения базы данных (и помочь заполнить раскрывающиеся списки). и т.д.

...