【自然框架 NatureFW】里的两种“映射”方式

简介:    自然框架里面采用了两种映射关系,一个是流行的ORM,另一是非主流的“CCM ” (我自己想的,呵呵)。   先说一下ORM。ORM是O和R的映射关系。也看到很多人写关于ORM的文章,发现好像有个误区。

  

自然框架里面采用了两种映射关系,一个是流行的ORM,另一是非主流的“CCM ” (我自己想的,呵呵)。

 

先说一下ORMORMOR的映射关系。也看到很多人写关于ORM的文章,发现好像有个误区。这个误区就是,要么根据数据库来生成实体类,要么根据实体类(UML)来生成数据库。ORM有这么简单吗?这个误区导致了一个很严重的问题——滥用!!

 

用好ORM的关键,我举的在于:设计O的时候是否会受到R的影响;同理,设计R的时候,是否受到了O的影响?也就是说设计实体类的时候,完全不去考虑数据库,设计数据库的时候也完全不考虑实体类!

 

用实际的工作经历来说明一下。我在做设计的时候,先根据需求设计数据库,这时候完全没有考虑类要如何设计(其实一开始根本就没有用实体类,呵呵)。

 

后来框架不断扩展,发现个问题:不弄个实体类来管理一下,确实挺麻烦的。那么如何来设计需要的类呢?

 

有一个表就建立一个类,表里的字段都是类的属性吗?真的是真么简单吗

 

既然要设计类,那么就要把表结构忘掉,完全按照实际需求和面向对象的要求来设计。然后类和数据库都设计好了之后,再去考虑如何映射。我觉得只有这样做的才是真正的ORM

 

比如:自然框架元数据的数据库里有一个表“Manage_Columns”,他是记录字段的基本信息(字段名、字段类型、字段大小等)和验证信息、控件描述等。因为这些信息都是跟随字段的,所以就都放在了一个表里面。

 

实体类里有一个类“ColumnMeta”,他的属性只有字段的基本信息,没有验证信息等。这是因为这个信息是很多地方都需要用到,而验证信息并不是必须的。只有页面表单里面才需要,“数据列表”和“数据查询”都不需要。

 

这样一来,表和类就不是完全对应,而是把一个表“拆开”了,对应多个类。

 

在比如:表单里的控件有很多种类,文本框、下拉列表框、多选等,而文本框有分为单行、多行、密码等,还有日期选择等等情况。那么如何来描述这些不同类型的控件呢?把属性都拿出来做成字段?还是把不同的控件都拿出来做成表?

 

这两种方法都有很明显的缺点——不便于维护!多一种控件,就要多一些字段,或者多一个表。这样就给扩展带来了麻烦,修改的时候也很麻烦!想一想,自然框架推广了(假设一下,呵呵)。好多人都在用,突然告诉大家,数据库里要多两个字段。不把这两个字段加上,就不能用新版本。这是一件多么麻烦的事情呀。

 

要尽量避免这种事情,那么要怎么处理呢?我的解决方法就是——在数据库里就设置一个字段,然后把描述信息都放进去。一开始采用~来分隔,后来发现不太便于查看。于是现在新版本采用json的格式来做控件信息的描述。然后把整个描述信息放在一个字段里。这样怎么扩展,数据库都不需要有变化了。

 

再来看看实体类的设计。数据库里用一个字段,那么实体类不能只有一个属性来表示,这样就太不方便了。于是设计了一套类。如下图。采用基类的方式。这样,数据库里的一个字段,就对应了一套类。

 

 

=====================================================

 

另外ORM还有一个小问题,就是ORM的粒度只是做到实体类和表并没有做字段。在ORM里字段是不能独立存在的,这样就造成了一个麻烦——多表关联的怎么办?

 

所以就想出来了——CCM

 

CCM是啥呢?就是 control column的映射。页面里的控件和数据库里的字段,直接对应起来。

 

Control指的是文本框、下拉列表框这一类的控件,不包括GridView这一类的控件。

  

我是用一种“映射”,把字段和控件关联起来,实现快速开发。他的粒度更细了一层,字段是可以独立出来的,并不限于一个表内。于是字段就可以“复用”。一个字段(的描述信息)就是一条记录,表单里需要的字段就是一个集合,数据列表里需要的字段是另一个集合……这样就非常方便。这样处理带来了很多好处,最明显的就是——权限到字段!

 

 

 

 

 

 

 

 

 

相关文章
|
5月前
|
JavaScript 前端开发 Java
函数形状的定义方式在编程中可以有多种,具体取决于使用的编程语言和上下文。以下是几种常见的定义方式:
函数形状的定义方式在编程中可以有多种,具体取决于使用的编程语言和上下文。以下是几种常见的定义方式:
39 3
|
5月前
|
缓存 JavaScript
计算属性和方法有什么区别?怎样选择
计算属性和方法有什么区别?怎样选择
|
JSON JavaScript 前端开发
突破常规的前端技巧与方法(二)
突破常规的前端技巧与方法(二)
51 0
|
JavaScript 前端开发 测试技术
突破常规的前端技巧与方法(四)
突破常规的前端技巧与方法(四)
65 0
|
前端开发 安全 JavaScript
突破常规的前端技巧与方法(一)
突破常规的前端技巧与方法(一)
88 0
|
前端开发 JavaScript 搜索推荐
突破常规的前端技巧与方法(三)
突破常规的前端技巧与方法(三)
173 0
突破常规的前端技巧与方法(三)
|
关系型数据库 MySQL 数据库
数据库技术知识点(一)IDEFO需求建模方法、解释实体、实体型、实体集的区别、完全函数依赖、部分函数依赖、传递函数、平凡函数依赖、非平凡函数依赖举例、超码、主码、候选码的概念与区分
数据库技术知识点(一)IDEFO需求建模方法、解释实体、实体型、实体集的区别、完全函数依赖、部分函数依赖、传递函数、平凡函数依赖、非平凡函数依赖举例、超码、主码、候选码的概念与区分
数据库技术知识点(一)IDEFO需求建模方法、解释实体、实体型、实体集的区别、完全函数依赖、部分函数依赖、传递函数、平凡函数依赖、非平凡函数依赖举例、超码、主码、候选码的概念与区分
|
SQL
【自然框架】——自然框架的命名空间
  为什么要有命名空间?类多了不便于管理,把他们给他分个类整理一下,便于管理。     那么命名空间就有了两个使命,分类和标识。其实标识也是一种分类。   我们打开Reflector.exe看看.net框架里的命名空间。
824 0
【自然框架】内部类库、控件的引用关系(最新整理,基本稳定)
  和以前相比,减少了一个项目,把Control_Interface合并到CommonFunction里面。这样引用关系就简单多了。   基本上分为三个层次:类库、自定义控件、页面基类。其中的 MetaData 负责元数据的定义和加载。
647 0
【自然框架】之“元数据”的威力
定义      元数据最本质、最抽象的定义为:data about data (关于数据的数据)。它是一种广泛存在的现象,在许多领域有其具体的定义和应用。       我的理解就是对数据进行说明、描述。
851 0