从两个列表中查找要删除的合适数据结构

时间:2012-09-26 10:09:33

标签: database performance algorithm data-structures

这可能会被删除,因为涉及想法共享,这在堆栈溢出中是不允许的,但在此之前,如果我能从实体程序员那里得到任何想法,那对我来说将是一个胜利的局面

假设您有一个存储在数据库中的 Student 类,并且此类具有名为 favoriteTeachers 的列表属性。该列表不断由系统更新,并涉及教师的身份。

您还有一个班级教师,也存储在数据库中,同样有一个列表属性 favouriteStudents 。它会不断更新并涉及学生的身份。

在我们的系统中,当学生调用一个函数(假设 notMyFavoriteTeacher )时,我们的系统必须应用以下更改;

  1. 从favouriteTeacher列表中删除指定教师的ID
  2. 从给定教师的favouriteStudent列表中删除学生的ID
  3. 我已经尝试考虑更新的行数可能会耗尽数据库,因此不是将学生与他们喜欢的教师映射到单独的表中作为 user_id,teacher_id ,而是创建了一个列,存储了一个字符串,其中包含以逗号分隔的教师ID。 (例如:“1,2,14,4,25”)。同样适用于老师

    然而,当我们调用此函数时,我们还面临另一个问题。为了完成此操作,您需要将字符串转换为列表,通过线性搜索找到元素,稍后再删除,稍后将列表转换为字符串并推回到db。你还必须为老师课做其他操作。如果我们没有应用字符串方法,删除会更容易,但由于我们将每天处理2k次删除和添加操作,我认为它不会可行使用单独的表格。

    我想问一下为了减少操作次数,是否可以选择数据结构以提高效率?

3 个答案:

答案 0 :(得分:3)

将关系作为数组存储在单个列中违反了first normal form,并且不应该在没有充分理由的情况下进行。虽然在某些情况下各种形式的非规范化可以导致效率提高,但我不认为这种情况是其中之一。更糟糕的是,在强制执行参照完整性方面,您将无法从数据库中获得帮助。并且一些操作将导致保证行扫描:当删除教师时,您将必须检查每个学生的每一行以从每个学生最喜欢的列表中移除教师。删除学生同样如此。

设计和构建关系数据库以将行链接到其他行。你需要一个很好的理由让他们不要做他们设计的事情。您应该继续设计一个适当的关系模式,并且只有当实际测量表明它太慢时才会担心它的性能。

答案 1 :(得分:0)

首先,我不理解您选择将喜爱的教师/学生的ID存储为逗号分隔的字符串,因为在逗号分隔值的情况下或者在具有studentId,teacherId结构的表的情况下,您可以正好有2行更新/删除(首先在favoriteTeachers表中,第二行在favoriteStudent表中)。

但是,根据您当前的数据结构优化性能的一种方法是保持逗号分隔的字符串排序。我的意思是从行的形成,保持你的逗号分隔id,如“1,5,7,15”。这样,如果将其转换为列表,则可以执行二进制搜索,它将花费Log(n)时间而不是n。

答案 2 :(得分:0)

通过将其存储为字符串列表,您将失去任何RDBMS提供的所有好处。使用Student_id和收藏夹teacher_id创建一个单独的表。在将其加入主表之前,应用过滤条件(针对学生或教师)。