CQRS讨论

今天和同事一起讨论了CQRS(Command Query Responsibility Segregation),过程中,我产生了一些疑问,先记录在这里,以后有解决方案了再说。:)

http://blog.jteam.nl/2009/12/21/rethinking-architecture-with-cqrs/

以下是讨论正文:

发件人: 1B-2-12 胡庆访;

发送时间: 2009年12月31日 12:36

收件人: 1B-2-14 穆洪星;3D-1-02 周金根

抄送: 1B-2-05 李智; 1B-2-13 孟伟斯

主题: 答复: 使用CQRS重新考虑架构

CQRS其实是说在使用DDD的应用程序中,可以把查询分开来,这样可以提高查询的效率。不知道我这样理解对不对。

不过这点我之前做程序的时候也有所体会。Web开发使用纯粹的DDD,还要保证不错的效率,是一个挑战!类似这个问题,在我的这篇博客中有写。

我之前分享给大家的那个网站591jzw,就是朝着这个方向前进的。

其底层使用了LINQ TO SQL作为一般的Class-Table级映射,提高数据访问的高开发效率。(如果觉得某个方法的性能较低,可以直接使用优化过的查询替换LINQ To SQL 即可。)然后再经过组合而成的中间层领域模型,针对的就是复杂的业务逻辑。

当时,为了不让查询分离而能使用模型取出指定的,我使用的模式是:在方法名中指定所需要的信息。这是考虑过很久后才决定使用的。不过的确是很丑!目前也没想到什么好办法,嘿嘿。

不过后来觉察到,就算这样,还是不应该所有的情况都使用Model来查询数据。类似纯报表的场景下,直接使用SQL当然最好了。这可能就是所谓的CQRS吧。

但是,如果这样,我也有个比较大的问题:有些数据是经过业务逻辑计算出来的,如果把它的查询放在SQL中,我觉得实在是有太舒服。这点有没有什么好的办法呢?

另外,关于贫血模式,如同文中作者所说,离DDD太远了……纯粹的数据,又怎么能叫OO呢?

至于是用Struct还是 用Class,我觉得这个也是一种权衡吧。虽然C#中也可以使用Struct进行数据定义,并在栈上分配,速度较快。不过Struct是不能实现OO的,这个就得考虑模型使用的上下文了。

题外话:

如果使用Struct来实现贫血模型的时候,Struct的性质注定了它要不停的Copy值,我感觉也会造成比较大的开销,不知道对不对?

发件人: 1B-2-14 穆洪星 发送时间: 2009年12月31日 9:36 收件人: 3D-1-02 周金根 抄送: 1B-2-05 李智; 1B-2-12 胡庆访; 1B-2-13 孟伟斯 主题: 答复: 使用CQRS重新考虑架构

看得不是很明白。

对于贫血模式,我也觉得难以理解。既然类里面没有方法,只有Getter,Setter,那么和C里面的Struct,Delphi里面的Record在使用上应该没有区别。但是在实现上,贫血模式是使用类来实现,那么它的创建应该也是在堆里进行,而Struct,Record都是在栈里进行,堆和栈的效率应该是不同的,也就是说EJB是不是为了维持纯粹的面向对象的形式而不顾及效率?

同时,对于只有方法没有数据成员的静态类的设计,这和全局函数应该在使用上没有不同,我知道Delphi的全局函数是直接引址,而类方法(静态方法)应该不是直接引址吧,是不是也因为维持纯粹的面向对象的形式而不管性能了:)

对于查询,我之前所在的公司里是使用小型机+DB2+消息中间件(CICS,MQ或者Web Service)+客户端的方式,后台的查询使用SQL进行,每次只查询一部分数据,其余的用翻页来处理,这和金根提到的懒加载应该想法差不多,对于大数据量的查询和更新,的确可以考虑走别的路了:)

发件人: 3D-1-02 周金根 发送时间: 2009年12月31日 8:32 收件人: 1B-2-05 李智; 1B-2-12 胡庆访; 1B-2-13 孟伟斯; 1B-2-14 穆洪星 主题: 使用CQRS重新考虑架构

这个会简单介绍一下CQRS,http://www.jdon.com/jivejdon/thread/37891,具体还不清晰,但至少能知道DDD中对于查询需要走另一条路

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Youngxj

EMLOG博客添加OwO表情教程

2426
来自专栏施炯的IoT开发专栏

Windows Phone Developer Tools 7.1 Beta 新特性--使用Additional Tools

    5月24号晚上兴奋地等待,在浏览器缓冲了近30分钟后,我终于看到了芒果更新的Webcast,虽然只是看了一个结尾。第二天通过小指的围脖收到风声,芒果更新...

1929
来自专栏菩提树下的杨过

Web开发感悟:数据绑定是一种技术,更是一门艺术

1、前言 作为一个多年从事b/s开发的程序猿,曾先后使用过asp、asp.net做为主要服务端语言。不管是相对低级的asp也好,还是高级的asp.net也罢,都...

2055
来自专栏静晴轩

Rake让Jekyll写博更优雅

于想拥有个人站点品牌的人来讲,现如今是一个很好的时期。至少 Hexo、Jekyll、Leanote、WordPress 、FarBox Octopress、gh...

3675
来自专栏web编程技术分享

【Java框架型项目从入门到装逼】第一节 - Spring框架 IOC的丧心病狂解说,来一波神的视角

3106
来自专栏SAP最佳业务实践

SAP最佳业务实践:FI–现金管理(160)-14银企对账-客户收款-承兑汇票-F-36收到承兑汇票

4.5.2 F-36收到银行承兑汇票 收到客户银行承兑汇票支付应收账款,形成财务记账如下: 借:应收票据 贷:应收账款 ? 输入凭证日期、参照、抬头文本 回...

2958
来自专栏FreeBuf

【永不消逝的电波(二)】HackRF入门:家用无线门铃信号重放

0x00 前言 在第一篇文章:永不消逝的电波(一):无线电入门篇 我们了解了一下无线电的发展史以及无线电的一些物理知识,在第二篇里我们将用HackRF录制家用...

2777
来自专栏FreeBuf

物理黑:关于HID的一些攻击姿势解析

本文原创作者:mrzcpo 本文内容带有一定的攻击性,仅供学习交流使用,严禁用于非法用途 临近期末考试了,利用烧鹅配合一个简单的木马程序其实可以轻松的从老师的电...

2087
来自专栏逍遥剑客的游戏开发

XACT基本概念

963
来自专栏Crossin的编程教室

【Python 第4课】输入

Hi~Crossin又来了。 可以用编程语言让计算机按你说的指令做事情之后,大家是不是有些跃跃欲试呢?别着急,先回顾一下我们之前几节课。我们到现在一共提到了三种...

3177

扫码关注云+社区