ManyToMany * set *的最佳表格结构

时间:2018-06-18 06:50:53

标签: java mysql database-design hash

我有2个Java实体 - 学生和课程。 他们之间的关系是ManyToMany - 每个学生都有很多课程,每个课程都可以由很多学生参加。

因为有很多重复的课程,我们决定制作一套课程表,每次学生想要学习一套课程时,他都需要查看是否已经设置了这样的课程,如果有的话,他将使用它的id,如果没有,他将创建这个集合。如果学生已完成此设置,我们会在setId字段中设置null

问题是课程表是动态的 - 我们可以随时添加和删除课程(除非有学生使用此课程),并且课程数量没有限制 - 甚至可以是150

我们需要搜索一组的存在,尽可能快。

我们考虑过:

  1. HashCode但是这个HashCode需要是动态的,甚至应该支持2 ^ 100种可能性。

  2. 将课程的ID作为字符串连接起来并搜索该字符串以查看该集合是否存在。

  3. 为每个课程分配一个素数,该组的id将是素数的乘法 - 问题是最大的数字(所有课程的集合)可能太大,而且分解这个数字可能需要很长时间。

  4. 对于这些要求,最佳实施方案是什么?欢迎任何想法!

    (我们不想使用传统的ManyToMany表的原因是性能问题。有一个很大的计算导致这种情况。)

    谢谢!

2 个答案:

答案 0 :(得分:1)

预测......

100个课程将导致几十个非常受欢迎的"套装#34;以及成千上万的罕见套装。

你会发现"套数"太过笨拙而不实用。

答案 1 :(得分:0)

我在项目中遇到同样的问题,我在其中显示了包含默认列和订单的文档列表,并且来自一个表,如果用户更改了订单或在其列表中创建了任何字段,那么另一个条目将生成该表和行为当前用户设置了id 在我的情况下,需要你可以忽略它,并为用户选择的课程列表存储JSON,如果列表已经存在于表中,那么在这种情况下你可以为该用户分配set id。

  • HashCode不会是唯一的。
  • 有些时候Concatenate会出现空白间距问题,所以SortedSet<Integer> JSON总是一样的。
  • 例如:SortedSet setA = new TreeSet();