对于企业来说, 基础数据是宝贵的, 有价值的, 应该用可靠, 可以用多种语言, 多
种编程范式访问的方式保存.
具体业务逻辑是可变的, 不持久的. 将数据的存储和这些东西混杂在一起并无好
处, 会损害数据的可用性, 甚至破坏数据的长久价值.
对编程者, OO 封装用来防御变化, 但是对于企业, 数据的长久价值, 数据的深入
挖掘, 都是建立在一个相对稳定的数据模型上的, 偏向编程者的方式不能给企业带
来更好的利益.
我认为在高层用更好的手段来适应业务代码更喜欢的 OO 模型和底层的 RDBMS 模
型才是好的处理方法, 目前的 ORM 是单纯地让 RDBMS 模型去适应 OO 模型, 未必
是合适的.
并且, 高层的 OO 设计, 未必是先设计好个体对象, 然后再考虑个体之间的关系才
是正招.
对应某些应用, 先考虑好这些关系, 给这些关系设计好抽象的访问模型, 然后再设
计个体, 可能能同时兼顾内存访问性能和数据库访问性能.
莫华枫 写道:
> 抽象惩罚不光语言里有,在业务开发的时候也有。
> 我以前做过一个面向对象的数据库中间层,把数据库的数据包装成对象,并且在
我不认为底层用 oodb 是好事情.
对于企业来说, 基础数据是宝贵的, 有价值的, 应该用可靠, 可以用多种语言, 多
种编程范式访问的方式保存.
具体业务逻辑是可变的, 不持久的. 将数据的存储和这些东西混杂在一起并无好
处, 会损害数据的可用性, 甚至破坏数据的长久价值.
对编程者, OO 封装用来防御变化, 但是对于企业, 数据的长久价值, 数据的深入
挖掘, 都是建立在一个相对稳定的数据模型上的, 偏向编程者的方式不能给企业带
来更好的利益.
我认为在高层用更好的手段来适应业务代码更喜欢的 OO 模型和底层的 RDBMS 模
型才是好的处理方法, 目前的 ORM 是单纯地让 RDBMS 模型去适应 OO 模型, 未必
是合适的.
并且, 高层的 OO 设计, 未必是先设计好个体对象, 然后再考虑个体之间的关系才
是正招.
对应某些应用, 先考虑好这些关系, 给这些关系设计好抽象的访问模型, 然后再设
计个体, 可能能同时兼顾内存访问性能和数据库访问性能.
我曾经偷懒用过另外的方法, 当时的应用不需要 runtime 生成不同的映射. 所以
我用 powerdesigner 将库结构 dump 出来(这样, 对不同的数据库, 有一个通用的
格式), 然后用 python 分析这些 sql, 根据给明的一些指示信息, 让 python 直
接生成一堆的访问代码, 进行一些 OR map, 同时兼顾单个的访问和带关系的数据
fetch.
这样比写一个通用的 or mapping 层简单很多.
> 现在很多三层以上的软件模型,基本上都存在这么一个er到oo的映射层,通常都
> 是手工打造的。我过去做的那个东西,就是这个映射层的自动化,打算构成一个
> 通用平台,服务多种软件。但是由于技术和条件,以及我的能力限制,没有达到
> 令人满意的效果。但是从使用上来看,的确方便了某些方面的操作(非查询性的
在2007-12-12来自"莫华枫" <longsh...@gmail.com>的邮件[[TopLanguage]
Re: 无处不在的抽象惩罚]中写到:
> 比如我们经常为了性能,把一个表拆成若干个表(有一个抽象惩罚),比如帐务
> 系统按月存放凭证单据,并且存放每个月的期初和期末数,便于快速地获得某些
> 统计数据。
--
DEBUG是件快乐的事情 <xuzi...@gmail.com>
1)减少数据损坏的可能性。
2)各分区可以独立备份和恢复,增强了数据库的可管理性。
3)可以控制分区在硬盘上的分布,以均衡IO,改善了数据库的性能。
DB2:
表分区特性提供以下收益:
表数据可轻易实现转入和转出
对大型表的管理更加轻松
灵活的索引放置
更高的业务智能样式查询的性能
在2007-12-12来自"莫华枫" <longsh...@gmail.com>的邮件[[TopLanguage]
Re: 无处不在的抽象惩罚]中写到:
> 表分区?不太明白。
--
DEBUG是件快乐的事情 <xuzi...@gmail.com>
> 而且也替代不了阶段性的汇总值带来的性能提升。在数据方面的更多的性能提升依赖于先期的数据汇总处理,典型的就是olap
当然这个是无法替代阶段性的汇总值带来的性能提升,但是可以让业务处理一致起
来,不至于一个业务要对于两个不同的表,写两套不同的SQL。
对于阶段性的汇总,为什么不在业务上进行分离,单独建表来提升性能,为何一定
要分表?
--
DEBUG是件快乐的事情 <xuzi...@gmail.com>
啊,这个问题么,这么说吧。这里我之前的做法, 是抛弃数据库系统的可移植性, 让数据库系统来应付性能需求.
对于实际应用db是oo还是er不是核心问题。不管是什么db,持续化都是基础,数据安全都是可以保证的。关键是对业务数据和数据关系的表达。从数据处理 角度来看,er更加方便和直接;而从业务模型的角度来看,oo则更符合人的思维。
oodb的oo实际上并不适合。严格地讲,oodb的oo和oop的oo还不一样。oodb更侧重于adt。
比如我们经常为了性能,把一个表拆成若干个表(有一个抽象惩罚),比如帐务系统按月存放凭证单据,并且存放每个月的期初和期末数,便于快速地获得某些统计 数据。但是,从业务角度来讲,只关心这些统计数据,至于如何来的,则无需费心。在传统的ui-erdb两层模型中,这种底层实现对于业务实现都是可见的, 必须处理这些workaround。而adt在这里则起到屏蔽层的作用。业务模型无需关心底层的实现,不管业务数据存放在几个表里,上层的业务流程代码都 是一样的。这就方便了软件的改进和调校。
adt同时还提供了非原子类型的导出,将数据对象之间的关联以成员的形式表示,通过类上的成员获取关联的数据对象。
现在很多三层以上的软件模型,基本上都存在这么一个er到oo的映射层,通常都是手工打造的。我过去做的那个东西,就是这个映射层的自动化,打算构成一个 通用平台,服务多种软件。但是由于技术和条件,以及我的能力限制,没有达到令人满意的效果。但是从使用上来看,的确方便了某些方面的操作(非查询性的数据 访问)。
纯oodb的问题在于,按oo存储对象没有问题,但如何才能将这些对象组织起来,提供高效方便的数据查询,是个棘手的问题。似乎至今也没有哪家厂商处理好 这个问题。
oql和sql3实际上都是er数据库的oo化。前者侧重于oo,而后者侧重于er。但是无论如何,对象化的sql,在实际使用中都是必不可少的。
回到主题说两句:实际上,即便是er,也存在很多抽象惩罚。比如我们就很少使用第3以上的范式,主要都是为了性能考虑。
数据库给我们提供了相当丰富的抽象手段和机制。Table是基础。View给我们不同的视角看待数据。Trigger给我们事件以及处理的绑定。……,其实,数据库系统给我们多少抽象惩罚呢?我觉得大多数情况下,它给我们的比我们设想的还好,我不认为一个人针对一个具体的业务模型【更具体的说是数据模型】抽象出来的框架比数据库的关系型框架能好多少,而且一般情况下是更差。