问题描述
描述很长,请耐心看完。一个项目曾经碰到过的需求,一个对象可能有多个版本,但当前只是用一个,有效历史版本都必须保留,用纯数据库方式和代码控制的。上来问问大家有没有Hibernate,也就是面向对象设计上的方案。案例如下,纯属虚构:1、国家修改法规处罚标准,使得处罚标准和力度发生变化,比如:仿冒知名品牌获利罪1980年版,仿冒知名品牌获利1万以内,处以7~10年监禁;1990年版,仿冒知名品牌获利10万以内,处以5~8年监禁;2000年版,仿冒知名品牌获利20万以内,处以4~7年监禁,并处以双倍获利处罚;2010年版,仿冒知名品牌获利50万以内,处以3~5年监禁,并处以双倍获利处罚;2、具体犯罪记录罪犯A,1986年发现其当年触犯仿冒知名品牌获利罪,适用1980年版;罪犯B,1992年发现其1987年触犯仿冒知名品牌获利罪,适用1990年版;罪犯C,2004年发现其1993年触犯仿冒知名品牌获利罪,适用2000年版,但超过追诉期10年,罚款但不监禁;3、系统当前2011年,查询仿冒知名品牌获利罪时应显示2010年版,但对不同罪犯历史记录查询时,要显示其犯罪时所适用版本标准,以及调查发现期所真正施行的版本标准;补充:上述案例中,有很多种犯罪条款,每个犯罪条款都有不同的版本时间段、处罚条件和处罚标准。请问各位,这种系统如何基于模型来设计,尤其适用Hibernate持久化时,如何设计基础模型?谢谢!
解决方案
处罚条件和标准不统一的话, 很难用套到一个统一的模型里面. 业务逻缉简单还能应付过来, 随着业务逻缉越来越复杂, 附加在sql上面的逻缉越来越多, Schema冗余相信也越来越多. 这是违背使用Hibernate的初衷的~~~~那是自己找罪受了~~~~ 为避免了查询运行时再去分析适用条款的复杂性和潜在的性能问题, Criminal Record适当冗余判断结果, 把比对判断的业务逻缉放在Criminal Record导入之时为佳.