二、Meta-Data驱动

上一章从大的方向上介绍了一下HIPPO系统,从本章开始进入正题。

为了更好的组织系统的结构,把所有的基础信息抽取出来存储在数据库中。这种方式从BroadVision中学习得来。

为了实现这种数据的存储,需要几种不同类型的对象来存储,如下:

对象

表名

含义

Schema

ZR_SCHEMA

模式

Content

ZR_CONTENT

内容

Table

ZR_TABLES

模式对应的表

Attribute

ZR_ATTRIBUTE

每个表的所有的字段描述

在上述表达中,Schema是整个Meta-Data结构的最底层,所有的信息都要依附于它,那么到底什么是Schema呢,直译就是“模式”,系统中所有的内容描述最后都要归结为Schema的表达,如“新闻”、“用户”、“产品”等一系列内容,也就是可以理解为同类的内容属于一个Schema。

Content就是内容的意思,根据CMS来看,它应该是比较重要的一个层面,没错,在本系统中,Content实际上是对Schema的扩展,他拥有更多的属性,并且Schema和Content必须是一一对应的,如果有可能,可以理解为这两个属于同一部分,在实际应用中,我也做了一些触发器,当修改Content的时候,会同时去修改相关联的Schema,那么一定有人会问,那为什么还要分成两部分来存储呢,呵,说来话长,本来想完全学习BroadVision的方式,但是最后做了简化,所以有了今天的样子。

Table理解起来就更容易了,它完全没有上面两个对象的抽象与神秘,就是用来说明上面的内容都是用哪些表来存储数据,本来嘛,在关系型数据库中,说来说去,不管表现层如何,最后必须把数据存储在具体的表中。Shema与Table是一对多的关系,即同一个内容可以用多个表来存储,举个例子,“用户”这个模式,分成几个主要的表,一个是ZR_USER,里面存储着会员ID,会员登录号及密码等几个最基本的字段,ZR_USER_PROFILE这个表,存储着用户的扩展属性,如会员姓名,生日,身份证等。用的时候,把两个表加起来可以相当于一张表来使用。这种数据存储方式与把用户的所有字段均写在一个表中是两种完全不同的设计思想,其实本质上并没有谁好谁坏的区别,最主要的区别是在数据量很大的时候,我这种设计方式对数据库的压力会小一些,因为在登录的时候,只需要检查几个有限的字段,即便进行全表描述,也会占用更小的IO操作。还有第三种表,就是“子表”,我来给子表举个例子,一个会员可以拥有多个Email地址,如果把这些字段全放在一张表中,那就要预留多个字段,所以把它单独建一张表,然后用一个外键和用户表对应起来,就可以表达用户与EMAIL的一对多的关系,在前端展示的时候,会为这种一对多的子表有一个专门的表现方式。

Attribute更容易理解了,其实就是数据库中的字段,也就是说上面的Table所对应的字段的描述都存放在这个表中。为什么不叫Column呢,因为叫Attribute更具有对象的感觉,感觉能超越数据库似的,哈,其实没有区别。

其实在任何的数据库中,都可以找到一个系统表,里面存储着每个TABLE所对应的字段描述,为什么我们还要专门建立一个自己的表来重复存储呢?很显示,系统存储的信息完全是DB自有的信息,不能扩展,而且每个数据库的存储方式也不同,所以把它单独提取出来。

在系统中,开发了四个类来实现对以上四个表的描述,另外,还专门建了两个管理器的类对上述几个类进行管理,如下:

SchemaManager

ContentManager

使用这两个管理器可以创建新的Schema或修改已经存在的Content等。总之,这一切工作的想法就是尽量减少使用者与数据库的直接打交道,把所有的操作全部封装起来。用起来更有面向对象的感觉。

这里面有一个问题值得谈一下,使用对象方式的时候,对象的属性是在写程序的时候固定的,比如会员的身高、体重等,这些固化的属性并不会随着定制化而改变,可是数据库中的表完全有可能在定制过程中变得千差万别,那么用对象描述的时候怎么样保证他们能顺利的对应起来呢,我的做法是找几个固定的字段做成类的属性,如登录名,密码等,而姓名,身份证等信息,在User类中并找不到一个真正对应的属性,而是把所有这些属性放在一个大的Hashtable中,形成一个复合的属性,取个名字叫做 Properties,所以在使用的时候可以按如下方式引用

user.UserAlias 是用户的登录名

user.Properties[“NAME”] 就是会员的姓名

由上可以看出,不管对属性做了多少扩展,都可以用这种方式来很好的呈现了。

关于用户的密码存储及使用,后面会有专门的章节来讨论。

再来举个例子,如何取出所有的新闻:

假如新闻的Content的名字是EDITORIAL,则程序可以这样写:

ContentManager contentManager = new ContentManager(“EDITORIAL”);

DataTable table = contentManager.GetContent();

只要上述两句简单的描述就可以把所有的新闻取出来放入一个DataTable中备用,后期可以利用它直接填入DataGrid中。

在很多情况下,并不需要取出所有的新闻,这时就要做一个条件过滤,或取出前10条,或按某个字段排序等,针对所有这些功能,都已经对contentManager.GetContent()函数进行了多种重载,只要加上适当的参数即可,由于篇幅有限,不能一一说明。

听到现在,可能一直都是比较抽象的,也不知我到底要做什么,到底在干什么,但是Meta-Data这部分是系统的核心思想,理解这部分内容,即便不看后面的章节,也会对您以后的设计有很大的帮助。从下一部分开始,会进行部分关键代码的描述。

本文转自Aicken(李鸣)博客园博客,原文链接:http://www.cnblogs.com/isline/archive/2010/04/15/1712729.html,如需转载请自行联系原作者

ASP.NET开源框架之HIPPO技术内幕(二)--Meta-Data驱动相关推荐

  1. ASP.NET开源框架之HIPPO技术内幕(五)--控件结构

    五.控件结构 上一章讲的是如何实现多语言的设计,本章来讲一下控件部分. 不管后端的代码多么完善,多么完美,最后都要以一定的形式展示出来,并且要使用灵活,这时就会用到控件. 在ASP的年代,去写这种控件 ...

  2. ASP.NET开源框架之HIPPO技术内幕(四)--多语言的实现

    四.多语言的实现 上一章讲的是如何实现与数据的连接,本章来讲一下多语言是如何实现的. 现在很多公司都已经开展了国际化的运作,所以多语言的支持已经成为必须要考虑的一个因素,现在能真正实现多语言的系统大多 ...

  3. ASP.NET开源框架HIPPO系统技术内幕(一)

    一.概述 CMS是Content Management System的缩写,意为"内容管理系统".关于CMS的系统介绍,在网上可以找到很多,在此不做过多说明.CMS的产品也是多种多 ...

  4. asp easp 开源框架_国内ASP开源建站系统一览

    开源建站程序让编程高手和只懂打字上网的人都可以快速建立一个功能强大.界面漂亮的网站.不管你是想建一个博客.论坛.CMS.电子商务网站,或是Wiki.相册管理.RSS聚合和类Digg网站.你都可以通过这 ...

  5. PostgreSQL 技术内幕(二) Greenplum-AO表

    序言 Greenplum(以下简称 GP)是一种基于开源PostgreSQL基础上采用MPP架构的关系型分布式数据库,具有强大的大规模数据分析处理能力. GP有两种存储格式:Heap表和AO表.其中, ...

  6. 诸葛io的技术架构图_【总结】MySQL技术内幕二:InnoDB存储引擎技术特性

    二.InnoDB存储引擎 InnoDB是事务安全的MySQL存储引擎,通常是OLTP应用中核心表的首选存储引擎.同时,也正是因为InnoDB的存在,才使MySQL数据库变得更有魅力. 从MySQL 5 ...

  7. 嵌入式BootLoader技术内幕(二)

    三.Boot Loader 的主要任务与典型结构框架 在继续本节的讨论之前,首先我们做一个假定,那就是:假定内核映像与根文件系统映像 都被加载到 RAM 中运行.之所以提出这样一个假设前提是因为,在嵌 ...

  8. JavaWeb技术内幕二:Java IO工作机制

    IO问题是当今web应用所面临的主要问题之一,因为数据在网络中随处流动,在这个流动过程中都涉及IO问题,并且大部分应用的瓶颈都是IO瓶颈. 本章将从IO的角度出发,介绍IO类库的基本架构,磁盘IO的工 ...

  9. bootloader技术内幕

    本文详细地介绍了基于嵌入式系统中的 OS 启动加载程序 ―― Boot Loader 的概念.软 件设计的主要任务以及结构框架等内容. 一.引言 在专用的嵌入式板子运行 GNU/Linux 系统已经变 ...

最新文章

  1. linux一键安装包
  2. PHP正则表达式怎么匹配多行
  3. 判断目录是否存在并创建mkdir
  4. C++入门指南及实战 第一步 概述及经典HelloWorld
  5. CF455B A Lot of Games
  6. JDK源码解析之 Java.lang.String
  7. /* program p5_04_AC 《聪明人的游戏提高篇》 1307:【例1.3】高精度乘法
  8. 计算机应用基础工作页,计算机应用基础工作页
  9. putty和WinSCP后门检查及清理方式
  10. 一道基础 Java 面试题,但值得很多人反思!
  11. mysql备份怎么锁库_MySQL锁(一)全局锁:如何作全库的逻辑备份?
  12. python 安装PyQt4
  13. android 模板引擎,template.js模板引擎
  14. 13、TORCH.OPTIM
  15. word插入分隔符的方法
  16. 今天买了正版的beyondcompare 4.0
  17. java展示图片_Java中显示图片的方法
  18. Matlab:16进制excel转2进制mat
  19. 把单元格一分为二_怎么将一个单元格一分为二
  20. 入手一年,再谈HiFi耳机的“白月光”——飞利浦Fidelio X3

热门文章

  1. 记一次老虎机项目开发
  2. 智能窗帘定时程序c语言,基于51单片机的智能窗帘程序设计
  3. 爬虫Spider 05 - 代理参数-proxies | 控制台抓包 | requests.post() | 动态加载数据抓取-Ajax
  4. MYSQL合并多个单元格文本(group_concat)
  5. 苹果笔记本包_笔记本变脏了?是你这三招没做对吧!
  6. 开放报名|顶尖专家联合打造,首个系统化AI大模型前沿技术讲习班
  7. new date()标准时间转yyyy-mm-dd hh:mm 24小时制
  8. JavaWeb极速上手
  9. socket通讯工具类
  10. VMware官网下载、Win11家庭中文版使用VMware的卡顿优化、开启嵌套虚拟化解决HCL模拟器无法启动的问题