【问题标题】:Best table structure for *set* of ManyToManyManyToMany *set* 的最佳表结构
【发布时间】:2018-11-26 23:27:29
【问题描述】:

我有 2 个 Java 实体 - 学生和课程。 它们之间的关系是ManyToMany——每个学生有很多课程,每门课程可以被很多学生选修。

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

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

我们需要尽可能快地搜索集合的存在。

我们考虑过:

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

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

  3. 为每门课程分配一个素数,集合的 id 将乘以素数 - 最大的数字(所有课程的集合)可能太大,分解的数字可能需要很长时间。

什么是满足这些要求的最佳实施方式?欢迎任何想法!

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

谢谢!

【问题讨论】:

  • 什么是哈希码?
  • 设置了什么?,是表变量还是内存变量?如果是表格,那么如何将其设置为 null...?
  • @POrekhov HashCode 是一个函数,它为每个集合提供一个唯一编号 - 即,如果你给这个函数课程编号 1、7、15,它会给你一个唯一编号 X,它不会给你任何其他集合
  • @SunilKanjar 一组是多门课程,例如一组课程可以是课程编号 [1, 15, 19, 24, 33] - 如果 2 名学生使用同一组课程,我希望他们具有相同的 set-id
  • @J.Doe 你确定你的哈希码函数是唯一的吗?

标签: java mysql database-design hash


【解决方案1】:

一个预测...

100 门课程将导致几十个非常受欢迎的“集”,以及数万个不常见的集。

你会发现“套”的数量太笨重,不实用。

【讨论】:

    【解决方案2】:

    我在我的项目中遇到了同样的问题,我在其中显示带有默认列和顺序的文档列表,这些列表来自一个表,如果用户更改顺序或在他的列表中提供任何字段,那么另一个条目会进入该表和行为当前用户设置了 ID。
    在我的情况下,订单是必要的,您可以忽略它并为用户选择的课程列表存储 JSON,如果列表中已经存在,那么在这种情况下,您可以为该用户分配设置 ID。

    • HashCode 不会唯一。
    • 有时连接会出现空格间距问题,因此SortedSet<Integer> JSON 始终相同。
    • 例如:SortedSet setA = new TreeSet();

    【讨论】:

      猜你喜欢
      • 2017-09-26
      • 1970-01-01
      • 2012-06-19
      • 1970-01-01
      • 1970-01-01
      • 2011-02-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多