AX2010学习笔记-Surrogate Key(代理键)
得到了一些AX2012的What's new教程,但还没拿到AX2012的安装程序,只能根据教程臆断一下,由于只是根据教程,没有程序作测试,所以很难理解它的意思,等拿到安装程序后再测试验证。
关于开发部分,刚看了一下它的第四章Data Access,这一章主要介绍了如下内容:
1.Surrogate Key,代理键
2.Table Inheritance,表继承
3.Date Effective,有效期
感觉AX2012的数据访问部分增加了很多新鲜东西,在很大程度上改变了开发的模式,但是这样带来的复杂度是否会大于便利是值得考量的,我不喜欢无限制地给语言增加复杂度,X++本来就是用于ERP业务的快速开发工具,没必要把它弄成一个大而全的语言,不过微软要把它变成C#,那也没办法。
这篇文章主要介绍一下代理键的内容。
其实代理键不是个新鲜事物,它是针对Nature key提出的,在设计表的时候到底是以业务相关的字段作为主键还是用一个随机的流水号做为主键。我觉得这两种方式其实各有利弊,不能简单地说代理键理论就比自然键强很多。其实很多情况下,自然键和代理键也没有严格的区分。在ERP的经典建议中,有关于物料号的讨论,一般建议用流水号作为物料号,虽然物料号是物料的一个属性,与业务相关,但是用流水号来作为它的值,其实也就是代理键了。
在BI的维度表中常使用自增类型的int(SQL Server 是Identity)作为其代理键。
我想不到在AX里使用代理键的必要性,虽然AX本来就有天然的RecID可以做为其代理键。RecID给我的印象一直是阻碍数据导入速度的东西,如果没有这东西,直接用SSIS系统初始化是非常简单事情,由于RecID要在系统里产生,搞得做初始化只能在AX里做,本来期望这东西能干掉,到AX2012把这玩艺当成主键了,看来是没希望了。
OK,把RecId弄成了代理键,接下来的问题是,不能在客户交易记录窗体里里显示客户信息时用23495867234这样的东西吧?那用户看了估计死的心都有了。AX2012当然会考虑这个问题,看教程里它引入了几个新的属性来处理这事:
1.Surrogate key replacement fields
A set of user readable fields that are displayed instead of the surrogate foreign key. Client forms will use joined data sources to retrieve these fields at query time. The set of fields to use will be defined by a property on the new reference group control.
看这描述应该会给23495867234定义一组值,比如客户编码,客户名称,客户组之类显示在界面上。
2.AutoIdentification Field Group
A new system created field group that is populated by the developer or system with fields that form the default surrogate key replacement fields.
这个组应该类似于现在的AutoLookup组,将来这个组可以显示到界面的相应位置。
截止到AX2009版本,在从表中显示主表信息还是比较麻烦的事情,倒是希望AX2012新引入的表继承和代理键来处理这个问题。但是从教程看窗体上要加入好多个派生的数据源,祈祷速度不会太慢。。。