Отношения SQL для уникальных наборов строк - PullRequest
0 голосов
/ 18 мая 2018

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

Я придумал сценарий, отражающий то, что яя пытаюсь выполнить.

В этом сценарии мы пытаемся определить роль (и), которую следует назначить новому набору, исходя из набора навыков, которыми они обладают.Сотруднику можно дать несколько ролей.Например, инженеру-программисту, имеющему опыт управления, назначаются роли как инженера-программиста, так и технического руководителя.Тем не менее, данные роли должны точно соответствовать заданному набору навыков.Если новый найм приходит с каждым навыком, который мы ищем, мы даем им роль технического директора.Технический директор обладает всеми навыками как для инженера-программиста, так и для роли технического лидера, но им не назначены эти роли.

Я считаю, что моя проблема сводится к отношениям skill_set, где я пытаюсь связатьуникальный набор строк из таблицы skill в конкретный skill_set.Любой данный skill может быть во многих skill_sets, но при запросе skill_set я хочу вернуть только skill_set, который содержит все skills, но в настоящее время я не знаю хорошегоспособ запроса этого конкретного skill_set

Нам не нужно беспокоиться о попытке найти роли для списков skills, которые не являются действительными skill_sets.Они могут не возвращать никакой роли.

Примечание: эта схема не установлена ​​в камне.Изменение это, безусловно, вариант, поэтому, если я смоделировал это неправильно, мы можем это исправить.

CREATE TABLE IF NOT EXISTS `skill`  (
  `id` int(6) unsigned NOT NULL,
  `name` varchar(16) NOT NULL,
  PRIMARY KEY (`id`)
) DEFAULT CHARSET=utf8;

CREATE TABLE IF NOT EXISTS `skill_set` (
  `id` int(6) unsigned NOT NULL,
  `skill_id` int(6) unsigned NOT NULL,
  PRIMARY KEY (`id`, `skill_id`)
) DEFAULT CHARSET=utf8;

CREATE TABLE IF NOT EXISTS `default_role` (
  `skill_set_id` int(6) unsigned NOT NULL,
  `role_id` int(6) unsigned NOT NULL,
  PRIMARY KEY (`skill_set_id`, `role_id`)
) DEFAULT CHARSET=utf8;

CREATE TABLE IF NOT EXISTS `role` (
  `id` int(6) unsigned NOT NULL,
  `name` varchar(32) NOT NULL,
  PRIMARY KEY (`id`)
 ) DEFAULT CHARSET=utf8;

INSERT INTO `skill` (`id`, `name`) VALUES
  ('1', 'python'),
  ('2', 'javascript'),
  ('3', 'ec2'),
  ('4', 'docker'),
  ('5', 'management');

INSERT INTO `skill_set` (`id`, `skill_id`) VALUES
  ('1', '1'),
  ('2', '2'),
  ('3', '1'),
  ('3', '2'),
  ('4', '3'),
  ('5', '4'),
  ('6', '1'),
  ('6', '2'),
  ('6', '5'),
  ('7', '3'),
  ('7', '4'),
  ('7', '5'),
  ('8', '1'),
  ('8', '2'),
  ('8', '3'),
  ('8', '4'),
  ('8', '5');

INSERT INTO `default_role` (`skill_set_id`, `role_id`) VALUES
  ('1', '1'),
  ('2', '1'),
  ('3', '2'),
  ('4', '3'),
  ('5', '3'),
  ('6', '2'),
  ('6', '4'),
  ('7', '3'),
  ('7', '4'),
  ('8', '5');

INSERT INTO `role` (`id`, `name`) VALUES
  ('1', 'Junior Software Engineer'),
  ('2', 'Software Engineer'),
  ('3', 'DevOps Engineer'),
  ('4', 'Tech Lead'),
  ('5', 'CTO');

Также доступна скрипта SQL: http://sqlfiddle.com/#!9/86bcfe0

Некоторые примеры выходных данных:


С учетом навыков: ['python']

Вернуть роль по умолчанию: младший инженер-программист


С учетом навыков: ['python', 'javascript ']

Вернуть роль по умолчанию: Инженер-программист


С учетом навыков: [' ec2 ']

Вернуть роль по умолчанию: DevOps Engineer


С учетом навыков: ['python', 'javascript', 'management']

Возвращение ролей по умолчанию: инженер-программист, технический руководитель


С учетомнавыки: ['python', 'javascript', 'ec2', 'docker', 'management']

Вернуть роль по умолчанию: CTO

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...