专栏首页更流畅、简洁的软件开发方式【自然框架 NatureFW】里的两种“映射”方式

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

所以就想出来了——CCM。

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

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

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

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 翻动100万级的数据 —— 只需几十毫秒

    感谢大家的支持!!! 昨天发了一个邀请,邀请大家帮忙测试,效果还可以,下面小结一下: 通过内部的计数器得知:访问次数是1071(其中有好多是自己点的:)),...

    用户1174620
  • 【自然框架】—— 全貌

    补充:忘记了一件很重要的事情,我建立了一个小组 http://space.cnblogs.com/group/nature/ 欢迎大家加入。我们可以组织一些话...

    用户1174620
  • 我写项目的思路和“自然架构”

    我写项目的思路     三层的思路是要把页面(UI、数据显示)、业务逻辑、数据处理(也叫持久化)分离开来处理,思路自然是好的,但是一到了实际应用中,好多人...

    用户1174620
  • Windows 8.1 应用再出发 - 几种常用控件

    本篇为大家简单介绍Windows 商店应用中控件的用法,为方便讲解,我们在文本控件和按钮控件这两类中分别挑选有代表性的控件进行详细说明。 1. 文本控件 (1)...

    Shao Meng
  • Qt编写自定义控件52-颜色下拉框

    这个控件写了很久了,元老级别的控件之一,开发之初主要是自己的好几个项目要用到,比如提供一个颜色下拉框设置对应的曲线或者时间颜色,视频监控项目中经常用到的OSD标...

    feiyangqingyun
  • Qt编写自定义控件53-自定义宽高下拉框

    默认的qcombobox控件,如果元素item中的内容过长超过控件本身的宽度的话,会自动切掉变成省略号显示,有些应用场景不希望是省略号显示,希望有多长就显示多长...

    feiyangqingyun
  • 《科学》重磅论文:量子计算核心突破,密码或成摆设

    互联网时代绝大多数的加密,都由 RSA 算法完成。过去我们认为 RSA 不可破解,但随着量子计算的发展,RSA 的安全性正受到挑战。今天刊发在《科学》杂志...

    新智元
  • .NET(C#、VB)APP开发——Smobiler平台控件介绍:SignatureButton控件

    设置一个值,该值指示在GobileView中,当Visible指定的属性值为空时,当前单元格是否显示控件,并调整GridView中单元格的大小。默认属性设置为“...

    Amanda.li
  • 使用结构化的标头字段改善HTTP

    原文 / https://www.fastly.com/blog/improve-http-structured-headers

    LiveVideoStack
  • 我写项目的思路和“自然架构”

    我写项目的思路     三层的思路是要把页面(UI、数据显示)、业务逻辑、数据处理(也叫持久化)分离开来处理,思路自然是好的,但是一到了实际应用中,好多人...

    用户1174620

扫码关注云+社区

领取腾讯云代金券