如何为未来创建持久数据模型?

时间:2011-09-15 14:18:54

标签: algorithm

我总是关注数据模型在未来变化和向后兼容性方面的一致性。

假设我们有一个循环通过句点(每年)的应用程序和一个模型,其中一部分数据,这些层次组织,并且这个层次结构可能会或可能不会在不同时期之间发生变化,有些实现只是将它们分成一个每个周期都有不同的数据库,但是数据在周期之间互操作的问题,因为我们可以在每个周期中保持这个层次结构及其变化,而不必每个周期都存储整个层次结构,因为它不一定变化少得多改变一切,但有可能。

示例:

学术信息系统,我们在每个知识领域都有一个主题层次

  • 数学
    • 代数
    • 三角
    • 算术
  • 社会科学
    • 历史
    • 地理

现在基于这种等级制度保留每个学生在2010年期间的资格,现在在2011年之后的时期,等级变化

  • 数学
    • 三角
    • 算术
  • 代数/ *这里有变化* /
    • 代数
  • 社会科学
    • 历史
    • 地理

  • 数学

    • 三角
    • 算术 / *这里的其他变化不再是代数* /
  • 社会科学

    • 历史
    • 地理

系统正在运行并继续保持2011年期间的学生成绩,现在学生需要过去的评分期,但层次结构已经改变,因为您可以使系统成为先前的层次结构

我如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

以下是建模建议:主题实体应具有属性

  • subject_id(唯一主键)
  • 名称
  • superordinate_subject_id(如果为空,您的层次结构中有一个顶级节点)
  • 一生(from_year,to_year;当to_year为空时,它是当前活跃的主题)

名称相似的主题不应该有重叠的生命周期。每次对层次结构中的活动主题进行更改时,请复制主题并相应地更改生命周期字段。只要层次结构没有变化,您的数据就无需更改。

符合您的示例:

subject Mathematics, lifetime: from_year=2010, to_year=NULL
    Algebra:  lifetime: from_year=2010, to_year=2010
    Trigonometry: lifetime: from_year=2010, to_year=NULL
    Arithmetic: from_year=2010, to_year=NULL

subject Algebra: lifetime  from_year=2011,to_year=NULL
    Algebra: lifetime  from_year=2011,to_year=NULL

另一种选择是在主题中使用单个“年”字段,而不是生命周期;这可能是一个更简单的解决方案,更适合于您希望每个学科每年为每个学生存储不同等级的情况。但这意味着每个周期都存储整个层次结构,排除的是什么。

答案 1 :(得分:0)

不要混淆每个主体的身份及其在层次结构中的位置。

如果我在2010年获得代数中的B +,那么数据如下:

ClassID  StudentID   Grade
100      100001      B+

当您的类别发生变化时,“代数”类的ID不应更改。