Как сохранить большие реляционные данные - PullRequest
0 голосов
/ 24 марта 2011

Надейся и молись, чтобы вы все хорошо выздоровели.

У меня есть сценарий, в котором мне нужно написать очень большой набор реляционных / комбинационных данных, я ищу технику реализации, которая должна быть супербыстро.Это что-то вроде экспертной системы в AI.

У меня есть 4 сущности, Вопросы, Варианты, Преимущества и Сценарии:

  • Каждый вопрос может иметь несколько вариантов
  • КаждыйОпция может относиться к одному вопросу
  • При любой комбинации опций, для которых выделено преимущество, распределение называется сценарием
  • , сценарий может быть связан с любым количеством опций
  • сценарийможет относиться к любому количеству преимуществ
  • Каждое преимущество может быть включено в несколько сценариев

Теперь, например, мы рассмотрим пример:

  • У нас есть4 вопроса, q1, q2, q3, q4
  • q1 имеют 3 варианта q1o1, q1o2, q1o3
  • q2 имеют 4 варианта q2o1, q2o2, q2o3, q2o4
  • q3 есть5 вариантов q3o1, q3o2, q3o3, q3o4, q3o5
  • q4 имеют 2 варианта q4o1, q4o2
  • сценарий 1: для комбинации [q1o1, q201] выгода b1 выделяется
  • сценарий 2: для комбинации [q1o1, q201, q303] выгода b2 выделяется
  • сценарий 3: для комбинации [q201, q304] выгода b3 выделяется
  • сценарий 4: для комбинации [q304, q401] aвыгода b4 распределяется
  • сценарий 5: для комбинации [q402] выгода b5 распределяется
  • сценарий 6: для комбинации [q1o2, q2o2, q3o1, q4o1] пособие b5 распределяется

Таким образом,

  • ((3 + 1) C 1 х (4 + 1) С 1 х (5 + 1) С 1 х (2 + 1) С 1) - 1
  • (4 x 5 x 6 x 3) - 1
  • 360 - 1
  • 359

.где C обозначает Комбинация .

И если количество вопросов достигает 25, и каждый вопрос должен иметь 5 вариантов

  • ((5+1) ^ 25 - 1)
  • 6 ^ 25 -1
  • 28430288029929701375

сценарии могут быть построены

Я ищулучший способ сохранить эти реляционные / комбинационные данные в базе данных и получить доступ к ним.Будем ждать ответа от вас, ребята.

1 Ответ

0 голосов
/ 24 марта 2011

Следующий набор таблиц сделает это.

question:
  id
  ...

option:
  id
  question_id
  ...

option_scenario:
  option_id
  scenario_id

scenario:
  id
  option_count
  ...

scenario_benefit:
  scenario_id
  benefit_id

benefit:
  id
  ...

Единственное, что денормализовано в дизайне, это то, что scenario.option_count должно быть количеством вещей в option_scenario с этим scenario_id.

Чтобы сделать запрос, вам нужно будет активно использовать подзапросы. Предположим, что person_option - это еще одна таблица с параметрами, которые есть у конкретного человека. Затем, чтобы найти преимущества, которые имеет этот человек, вам нужно:

SELECT b.*
FROM (
    SELECT s.scenario_id
    FROM person_option po
      JOIN scenario_option so
        ON so.option_id = po.option_id
      JOIN scenario s
        ON s.id = so.scenario_id
    WHERE po.person_id = ?
    GROUP BY so.scenario_id, s.option_count
    HAVING s.option_count = COUNT(DISTINCT po.option_id)
  ) ps
  JOIN scenario_benefit sb
    ON sb.scenario_id = ps.scenario_id
  JOIN benefit b
    ON b.id = sb.benefit_id
...