我目前正在重写一个教师可以在线规划类(class)的应用程序。
该应用程序指导教师完成为学生创建作业单元的过程。该工具目前在三个州使用,但我们计划扩大规模。
该应用程序的一大亮点是所有学生的成绩都已预加载到系统中。这允许教师搜索或浏览并选择每个工作单元要达到的结果。
当我最初设计该系统时,我假设所有学生的成绩都遵循相似的层次结构。也就是说,有命名的嵌套容器,然后是结果。
我输入的原始结果集分为三层。因此,我的数据库具有以下结构:
=========================
粗体表格
h1
身份证,姓名
h2
id, parent___id (h1_id), 姓名
h3
id, parent___id (h2_id), 姓名
结果
id, parent___id (h3_id), 姓名
=========================
除了明显无法添加 n/层级之外,这种方法还使得在不递归查询数据库的情况下难以显示所有标准的列表。
添加学生成绩(及其父类别)后,几乎没有理由以任何方式修改它们。主要要求是它们易于阅读且高效。
到目前为止,来自不同学校/州/国家的所有学生成绩都大致符合我的假设。情况可能并非总是如此。
当然,所有现有数据都必须从当前数据库传输过来。
鉴于上述情况,我存储所有不同的学生成绩集的最佳方式是什么?下面列出了我的一些想法。
继续使用数据库中的 4 个表,选择使用 recusion 或 lots of join 时
使用嵌套集
XML(所有不同集合的全局 XML 文件或每个集合的 XML 文件)
最佳答案
我不知道您实际上为此需要 4 个表。
如果您有一个跟踪 parent_id 的表和一个级别,您可以有无限级别。
outcome
id, parent_id, level, name
您可以使用递归来跟踪任何特定元素的树(您实际上不需要级别,但使用它可以更容易查询)。
另一种方法是嵌套集。在这种情况下,您仍然会合并到一个表,但使用设置的东西来跟踪级别。
使用哪一个取决于您的应用。
读取密集型:嵌套集
写密集型:父树问题
这是因为使用嵌套集,您可以通过单个查询检索整个树,但代价是每次插入新节点时都要对整个树重新排序。
当您只跟踪parent_id时,您可以单独移动或删除节点。
PS:我对 XML 投反对票。您有相同的递归问题,加上解析数据以及将其存储在数据库或文件系统中的开销(这将导致并发问题)。
关于php - 表示在 PHP 中使用的 n/深度树的最佳方法(MySQL/XML/?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/339745/