2

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

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

您还有一个类Teacher,也存储在数据库中,同样有一个列表属性favouriteStudents。它再次不断更新并涉及学生的身份。

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

  1. 从 favouriteTeacher 列表中删除给定教师的 id
  2. 从给定老师的 favouriteStudent 列表中删除学生的 id

我试图考虑更新的行数可能会耗尽数据库,因此我没有将学生与他们最喜欢的老师映射到单独的表中作为user_id,teacher_id,而是创建了一个列并存储了一个包含教师 id 分隔的字符串逗号。(例如:“1,2,14,4,25”)。同样适用于老师

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

我想问一下,为了减少操作的数量,可以选择一种数据结构来提高效率吗?

4

3 回答 3

3

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

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

于 2012-09-26T10:21:43.213 回答
0

首先,我不明白您选择将最喜欢的教师/学生的 ID 存储为逗号分隔的字符串,因为无论是在逗号分隔值的情况下,还是在具有 studentId、teacherId 结构的表的情况下,您只需要 2 行更新/删除(第一个在 favoriteTeachers 表中,第二个在 favoriteStudent 表中)。

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

于 2012-09-26T10:23:26.193 回答
0

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

于 2012-09-26T12:30:06.603 回答