mysql - 在关系数据库中存储列表的最有效方法是什么?

标签 mysql arrays database-design relational-database database-normalization

我在这里和其他地方读到了许多关于在 mysql 中存储数组的强有力的声明。规范化规则似乎表明这是一个坏主意,并且在存储的数组中进行搜索会产生不优雅的代码。然而,对于我正在开发的应用程序来说,将数组存储在字段中似乎是一个合理的解决方案。我确信这是每个​​人在这个位置上的错误想法,但我想不出更好的方法。设置如下:

我有一系列表,用于存储注册学生、他们可以参加的类(class)以及他们在每门类(class)上的表现。所有这些都被“标准化”以避免重复和错误。我希望能够生成一个“我的类(class)”部分,以便学生在登录后看到他们有资格参加的类(class)以及他们已修读但可以自由复习的类(class)。我想到的方法是两个数组; my_eligible_courses 和 my_completed_courses。注册后,学生将获得一套他们有资格学习的类(class)。这可以存储为存在多个 Studentid 的行,其中一个对应于他们可以选修的每一门类(class):

学生1类(class)1 学生 1 类(class) 2 学生1类(class)n

然后可以在该表中查询学生 1 的所有符合条件的类(class),并在学生登录时以列表形式显示。

或者,studentid 可以是主键,并且在“eligible_courses”列中将有一个数组(类(class) 1、类(class) 2、类(class) n)。

有一个学生表现表,用于记录所修的每门类(class)以及与学生表现相关的指标。它将被查询以报告学生的表现、类(class)质量等,但该表将变得相当大。我很难相信生成 my_completed_courses 列表的最有效方法是在每次登录时通过 Studentid 查询此表,以便为他们提供已完成类(class)的列表。

另一个复杂之处是,学生符合资格的类(class)集是可变的,并且随着新类(class)的开发而扩展,在我看来,这似乎表明为每门新类(class)生成一组新列是一个坏主意 - 例如, new course_name, pretest_score, posttest_score, time_to_complete, ...此外,每个新类(class)的表对于生成一组简单列表的相对平凡的端点来说似乎是一个复杂的解决方案。

因此,重申一下问题,是将合格且已完成的类(class)的“不优雅”数组列表存储在注册学生表中,还是动态生成这些列表更好?

我猜这仍然太模糊,但是任何关于数据库设计的讨论,如果给出了不优雅的数组与重构模式的示例,我们将不胜感激。

最佳答案

您应该确信,如果您的表上有相应列的索引,那么查询 my_completed_courses 将非常快捷。

当您的表增长到您注意到速度变慢的程度时,您可以使用适当的内存分配设置来配置 MySQL 服务器,以便它可以在内存中缓存更多数据。或者你现在就可以调查一下。

响应您对添加新类(class)所做的编辑:不要为每门类(class)添加新列。不要为每门类(class)添加新表。为类(class)创建一个表,并为每门类(class)添加行。

然后,您应该能够在索引列上将表连接在一起,以生成所需的数据列表。

关于mysql - 在关系数据库中存储列表的最有效方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11337168/

相关文章:

java - 使用 hadoop 进行数据分析

arrays - 线程 1 : EXE_BAD_INSTRUCTION | assigning an array of objects values

database-design - 将继承的对象存储在数据库中

mysql - 找出 MySql 中基于逗号的值的计数

MySQL JOIN 最后一条记录

c - 使用malloc动态创建字符串数组

MySQL:数据库查询不正确或结构错误?

sql - 在 MySQL 中对数据库表进行分区

mysql - 如果我选择 varchar 字段而不是数字字段,为什么我的 sql 查询要慢得多?

javascript - 使用 .join() 连接嵌套在数组内部对象中的数组不起作用