如何保存大型关系数据

时间:2011-03-24 04:14:13

标签: database ruby-on-rails-3 database-design math data-structures

希望并祈祷你们都一定要好。

我有一个场景,我必须编写一组非常大的关系/组合数据,我正在寻找一种必须超快的实现技术。它就像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]的组合,分配了一项福利 b4
  • 方案5:对于[q402]的组合,分配了一项福利 b5
  • 方案6:对于[q1o2,q2o2,q3o1,q4o1]的组合,分配了 b5 的好处

所以就这样

  • ((3 + 1) C 1 x(4 + 1) C 1 x(5 + 1) C 1 x( 2 + 1) C 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 :(得分:0)

以下一组表格将会这样做。

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