首先以代码方式“从哲学上”解决问题。然后与代码和数据库进行“协商”,以实现它。
例如,如果您要处理一般性文章,则文章的初始概念可能如下所示:
class Article {
public Int32 Id;
public String Body;
}
在下一个最基本的级别上,我想保留一个修订列表:
class Article {
public Int32 Id;
public String Body;
public List<String> Revisions;
}
我可能已经意识到当前的机构只是最新的修订版。这意味着两件事:我需要为每个修订版标上日期或编号:
class Revision {
public Int32 Id;
public Article ParentArticle;
public DateTime Created;
public String Body;
}
并且...和本文的当前正文不需要与最新修订版不同:
class Article {
public Int32 Id;
public String Body {
get {
return (Revisions.OrderByDesc(r => r.Created))[0];
}
set {
Revisions.Add(new Revision(value));
}
}
public List<Revision> Revisions;
}
缺少一些细节;但这说明您可能想要两个实体。一个代表文章(或其他标头类型),另一个代表修订版本列表(将任何具有良好“哲学”意义的字段归为一组)。最初,您不需要特殊的数据库约束,因为您的代码本身并不关心任何修订-它们是了解修订的文章的属性。
因此,您不必担心以任何特殊方式标记修订或依靠数据库约束来标记“当前”文章。您只需为其打上时间戳(即使是自动添加的ID也可以),使其与其父文章相关,然后让该文章负责了解“最新”文章是最相关的文章。
然后,您可以让ORM处理较少的哲学细节,或者,如果您不使用现成的ORM,则可以将它们隐藏在自定义实用程序类中。
不久之后,在进行了一些压力测试之后,您可能会考虑使该修订版属性延迟加载,或者使您的Body属性仅延迟加载最高版本。但是,在这种情况下,您的数据结构不必更改以适应这些优化。