序言
本文写于Edu-CRM开发之前,现其中的功能大部分已经实现,实现时稍有不同,但基本思想不变。
设计要求
- 支持多Tenant
- 支持多语言
- 支持数据版本
- 支持自定义字段
- 支持自定义查询
- 支持数据导入导出
总体设计
- 利用Cache加快访问Localize和Metadata的速度
- 对于固定的数据使用DLINQ来进行查询,返回对象
- Metadata的定义采用name-value pair的方式
- 对于高级查询或者通用查询将使用Dynamic Query的方式,返回name-value pair
- 在系统中任何地方都需要通过支持多语言(如Metadata定义)
- 支持一定格式的数据导入导出(Excel,CVS等)
- 数据的修改需要通过Version来进行控制,能进行各种版本操作
详细设计
Metadata
数据库的设计将采用固定表的模式+Metadata数据库 + name-value Pair的方式
Metadata数据库存储数据库的结构(包括固定表和扩展的字段)
Name-value Pair的方式仅存储扩展字段的值
可以参考《SAAS多用户数据体系结构》
- CRM数据库的所有字段都在Metadata数据库中有定义,如果是CRM基础数据表或字段则定义不能被修改。
- 可以在Metadata数据库中定义Entity(表)
- 可以扩展现有Entity的Property也就是表中的字段
- 字段有类型、长度、校验表达式(客户端和服务器端)、是否可以查询
- 需要根据字段的类型处理该字段的Default Value,如字段类型为List,则DefaultValue为1,2,3,4,5
- 可以定义Entity之间的关系
- 数据采用name-value pair的方式进行存储
- 对于数据量比较大的Entity可以单独定义一张表进行存储数据
自定义查询
自定义查询涉及两个问题:
- UI(可以参考Microsoft Dynamic CRM)
- 可以让客户很容易的进行查询的自定义
- 能够支持AND、OR、Equals、GreaterThan、In、Like等操作
- 能够选择Entity以及Properties
- 能够将用户自定义的查询进行存储
2. 后台
- 能够将UI的查询翻译成SQL进行查询
- 返回的数据格式
基于以上的两个问题设计思路可以考虑使用XML树。
XML比较容易存储,利用树形来设计UI,设计一个类能够将XML树转化成SQL,返回的数据格式可以采用name-value pair的形式。
XML数据格式如下:
对应的SQL:
select ac.subject,ac.activityid,ac.scheduledstart,ac.regardingobjectid,ac.prioritycode,ac.scheduledend,ac.activitytypecode from activitypoit as ac
join activityparty as aa
on ac.activityid = aa.activity
join systemuser as ab
on ac.owninguser = ab.systemuserid
where (ac.statecode in (0,3)) or (ac.activitytypecode <>'4404')
aa.partyid='XXXXX' and ab.address1_city = 'ss'
多语言
- 可以根据不同的客户自动选择应用程序的语言,判断顺序如下:
- url,也就是query string (?loc=zh-cn)
- Cookie,也就是用户上次选择的语言
- 浏览器设置的语言
- 显示默认的语言
- 确定语言之后就需要显示Localize,在这里还需要考虑多Tenant的问题,具体的判断是先查找该Tenant的Localize,如果没有则使用默认的Localize
- 给用户提供UI可以进行翻译
- 使用缓存(web可以生成静态js文件;客户端程序则下载到本地,每次判断有无更新即可)
导入导出
- 在Grid控件上提供导入导出功能,根据Grid的数据源进行处理
- 提供通用的导出功能,可以选择导出的Entity,Properties,设定过滤条件进行导出,参考【自定义查询】
- 提供通用的导入功能,在导入时需要选择Entity,进行Property mapping,设定匹配原则。如果根据匹配原则找到的结果大于1,则需要进行人工操作
- Property Mapping采用如DTS的数据Mapping方式
- 如果存在重复数据时则可以使用列表方式来显示导入数据。选中一条导入数据可以查看数据库中和该条数据匹配的记录,可以选择其中一条数据进行更新
4. 导入导出数据格式转换,如F-Male(男)
5. 导入导出的方式可以为Excel、CSV、Web Service、XML
数据版本
- 用户可以配置哪些Entity需要进行版本记录
- 版本库可以通过ChangeSet进行查看每一批修改内容
- 版本库可以根据Label进行提取一系列数据
- 数据回滚也将通过ChangeSet增加一批修改记录
缓存技术
服务器端缓存
- Metadata数据可以在内存中进行缓存
- Localize数据可以生成静态文件
- 对于系统运行时数据进行缓存
Web Browser缓存
- PersistJS(Flash、Gears、Cookie、IE User Data etc.)
- SilverLight Isolated Storage