当前位置:  编程技术>软件工程/软件设计
本页文章导读:
    ▪采用PowerDesigner设计数据库       本文档不讲述如何使用PowerDesigner,而是讲述如何将PowerDesigner的特点结合数据库设计的方法更好的设计一个数据库系统。 采用PowerDesigner设计数据库   PowerDesigner作为数据库建模和设计的CASE.........
    ▪webservice基本概念描述       一 webservice Web Services 可使您的应用程序成为 Web 应用程序。Web Services 通过 Web 进行发布、查找和使用。通过使用 Web Services,您的应用程序可以向全世界发布信息,或提供某项功能。 1) 什么.........
    ▪设计模式应用与发展之工厂模式 c++篇      1     引子 这是一个幸福的时代,特别是作为一个java程序员(感慨一下,java程序员确实比C/C++程序员幸福)。 基于我个人的一贯风格,我不准备采用大量技术术语.........

[1]采用PowerDesigner设计数据库
    来源: 互联网  发布时间: 2013-11-19

本文档不讲述如何使用PowerDesigner,而是讲述如何将PowerDesigner的特点结合数据库设计的方法更好的设计一个数据库系统。

采用PowerDesigner设计数据库

 

PowerDesigner作为数据库建模和设计的CASE工具之一,在数据库系统开发中发挥着重要作用。

 

运用PowerDesigner进行数据库设计,不但给人直观地理解模型,而且充分运用数据库的技术,优化数据库的设计。PowerDesigner支持Sybase、Oracle、Informix、SQL Server等多种数据库系统,在应用系统做数据库迁移时不必维护多个数据库脚本。

 

对于采用结构化分析(SA),E-R图、数据流图直至最后的数据库物理图都是系统设计时不可缺少的一个部分,当数据库物理图完成后,应该产生系统的数据字典。运用PowerDesigner完全能够完成这一设计流程。

 

对于采用面向对象的分析(OOA),由于数据库采用的是RDBMS,因此存在对象和关系数据库之间的映射,也需要进行数据库设计。

两种数据库模型
PowerDesigner可以设计两种数据库模型图:数据库逻辑图(即E-R图或概念模型)和数据库物理图(物理模型),并且这两种数据库图是互逆的。
数据库逻辑图是对现实世界的一种抽象,体现实体之间的关系,可以有1对1、1对多、多对多等关系。特别说一点,在扩充E-R图中有概括这种关系,体现类型之间的一种子集联系,它定义了超类和子类。在PowerDesigner设计的E-R图中,不具备这种关系,但在E-RWin设计的模型中支持这种关系,因此在用E-RWin图设计的模型转化为PowerDesigner的模型时注意这种关系。
数据库物理图中是逻辑模型的物理实现,体现了表间的参照关系。在物理模型中不可能存在多对多的关系。在逻辑图向物理图转换时,多对多的关系变成两个1对多的关系。
      逻辑模型和物理模型有着紧密的联系,也有本质的区别。逻辑模型的设计遵循数据库设计理论的第三范式(在一般的数据库应用达到第三范式即可),逻辑模型要求具有应用系统所表达的所有信息并消除数据冗余。物理模型是在逻辑模型的基础上,为了优化应用系统的性能而采用增加冗余,创建索引等数据库技术,它主要用非规范化的一些理论。
       在考虑设计的任何非规范化之前,数据库应先完全规范化,在没有完全理解数据和用户需求之前,不能进行非规范化。否则导致数据的组织越来越混乱,应用程序越来越复杂。

       因此逻辑模型和物理模型是相互矛盾又紧密联系的,这点需要设计人员好好把握。

PowerDesigner设计数据库物理图
用PowerDesigner设计数据库物理图,包括多个对象,如表(Table)、字段(Column)、域(Domain)等。设计时主要在PowerDesigner的Dictionary和Database两个菜单中。
表(Table)
       表是数据存储的一个逻辑对象,包括其它对象如字段(Column)、索引(Index)、触发器(Trigger)、存储过程(Procedure)等,表的优化设计有分割等技术,对于表的存储,如果访问数据量大,访问频率高则可考虑将表放在不同的存储(Storage)上。
       在设计表时,应该估算表的大小和增长量,便于创建数据库时分配数据库空键,这样减少了磁盘碎片的产生。
       在关系数据库中设计主键时,采用有意义的主键是致命的错误。如果用户决定改变字段的商业含义,则需要在所有使用到该信息的地方进行修改。主键的作用应是保持唯一性和作为外键使用。任何对主键的修改会导致巨大的数据库维护工作量,显然这是不合适宜的设计。就关系数据库而言,设计主键策略采用的是代理主键的方法。

       设计主键时应该避免“热点”现象,但也需要分析具体的应用系统的并发用户而定。

字段(Column)
       定义一个字段主要有字段名、字段类型及长度、是否主外键、是否空、约束、默认值、域等。
       变长和定长的数据类型在数据库设计中讨论比较多,作为一般原则,如果预期某列中的数据范围变化很大,但变化并不频繁,那末对这样的列使用变长数据类型最为适宜。
       决定行长时,既不能太浪费,又不能太吝惜。考虑到将来的需要,并且意识到,如果增加行长而没有改变一页中容纳的行数,那末增加的空间就等于免费使用。
       设计时,字段尽量使用域,方便维护字段的类型。每个字段最好将默认值加上,因为在数据库查询中,有NULL值会影响查询的性能。
       通过CHECK约束可限制字段的取值。
域(Domain)
简单地说,是用户自定义类型,但域还可以定义它的取值范围或默认值,采用域减少了维护字段类型的工作量,也减少数据的不一致性。
参照(Reference)
参照在数据库设计中是一个比较复杂的问题,它是实现数据的完整性主要要素之一,详细论述参考后面数据的约束。
在PowerDesigner中,可对参照完整性进行各项设置,参照的基数从0到n,对修改和删除约束可分别设置为None、Restrict、Cascade、Set Null、Set Default。由于INSERT包含在UPDATE操作中,因此没有单独的INSERT约束。
约束的不同设置产生不同的效果,以修改为例(删除相同):
None:父表修改,子表不影响。
Restrict:父表修改,如果子表存在,则出错。
Cascade:父表修改,如果子表存在,则相应的修改。
Set Null:父表修改,如果子表存在,则相应置空。
Set Default:父表修改,如果子表存在,则相应置默认值。
索引(Index)
      
    
[2]webservice基本概念描述
    来源: 互联网  发布时间: 2013-11-19

一 webservice

Web Services 可使您的应用程序成为 Web 应用程序。Web Services 通过 Web 进行发布、查找和使用。通过使用 Web Services,您的应用程序可以向全世界发布信息,或提供某项功能。

1) 什么是Web Services?
Web Services 是应用程序组件
Web Services 使用开放协议进行通信
Web Services 是独立的(self-contained)并可自我描述
Web Services 可通过使用UDDI来发现
Web Services 可被其他应用程序使用
XML 是 Web Services 的基础

 

2)它如何工作?
基础的 Web Services 平台是 XML + HTTP。

HTTP 协议是最常用的因特网协议。XML 提供了一种可用于不同的平台和编程语言之间的语言。

Web services 平台的元素:
•SOAP (简易对象访问协议)
•UDDI (通用描述、发现及整合)
•WSDL (Web services 描述语言)

 

3)工作过程,如图:

 

二 SOAP

SOAP 是指简单对象访问协议(simple object access protocal)。

SOAP是基于 XML 的简易协议,可使应用程序在 HTTP 之上进行信息交换。或者更简单地说:SOAP 是用于访问网络服务的协议。

 

1) 什么是 SOAP?
•SOAP 指简易对象访问协议
•SOAP 是一种通信协议
•SOAP 用于应用程序之间的通信
•SOAP 是一种用于发送消息的格式
•SOAP 被设计用来通过因特网进行通信
•SOAP 独立于平台
•SOAP 独立于语言
•SOAP 基于 XML
•SOAP 很简单并可扩展
•SOAP 允许您绕过防火墙
•SOAP 将被作为 W3C 标准来发展

 

2)Why SOAP?
对于应用程序开发来说,使程序之间进行因特网通信是很重要的。

目前的应用程序通过使用远程过程调用(RPC)在诸如 DCOM 与 CORBA 等对象之间进行通信,但是 HTTP 不是为此设计的。RPC 会产生兼容性以及安全问题;防火墙和代理服务器通常会阻止此类流量。

通过 HTTP 在应用程序间通信是更好的方法,因为 HTTP 得到了所有的因特网浏览器及服务器的支持。SOAP 就是被创造出来完成这个任务的。

SOAP 提供了一种标准的方法,使得运行在不同的操作系统并使用不同的技术和编程语言的应用程序可以互相进行通信。

 

三 WSDL

WSDL 指网络服务描述语言 (Web Services Description Language)。

WSDL 是一种使用 XML 编写的文档。这种文档可描述某个 Web service。它可规定服务的位置,以及此服务提供的操作(或方法)。

 

1) 什么是 WSDL?
•WSDL 指网络服务描述语言
•WSDL 使用 XML 编写
•WSDL 是一种 XML 文档
•WSDL 用于描述网络服务
•WSDL 也可用于定位网络服务
•WSDL 还不是 W3C 标准

 

四 UUDI

UDDI 是一种目录服务,企业可以使用它对 Web services 进行注册和搜索。

UDDI,英文为 "Universal Description, Discovery and Integration",可译为“通用描述、发现与集成服务”。


1)什么是 UDDI?
UDDI 是一个独立于平台的框架,用于通过使用 Internet 来描述服务,发现企业,并对企业服务进行集成。

•UDDI 指的是通用描述、发现与集成服务
•UDDI 是一种用于存储有关 web services 的信息的目录。
•UDDI 是一种由 WSDL 描述的 web services 界面的目录。
•UDDI 经由 SOAP 进行通信
•UDDI 被构建入了微软的 .NET 平台
UDDI 基于什么?
UDDI 使用 W3C 和 IETF* 的因特网标准,比如 XML、HTTP 和 DNS 协议。

UDDI 使用 WSDL 来描述到达 web services 的界面

 

2)UDDI 的好处
任何规模的行业或企业都能得益于 UDDI。

在 UDDI 之前,还不存在一种 Internet 标准,可以供企业为它们的企业和伙伴提供有关其产品和服务的信息。也不存在一种方法,来集成到彼此的系统和进程

    
[3]设计模式应用与发展之工厂模式 c++篇
    来源: 互联网  发布时间: 2013-11-19
1     引子

这是一个幸福的时代,特别是作为一个java程序员(感慨一下,java程序员确实比C/C++程序员幸福)。

基于我个人的一贯风格,我不准备采用大量技术术语和官腔讲述这次的主题:工厂模式应用与发展。今时今日提到工厂模式,相信绝大部分的人都已经对这个词汇有所了解(恩恩,注意我的用词,我没说“对他的概念、含义和用途有所了解”)。

那么,在开始进入正题之前,我们先回顾一下工厂模式的作用(我不准备列举在这,自己想想)。

OK,下面开始我的讲述,请大家耐心点(是的,我怕有人半途而废;噢,再啰嗦一下,重点在示例代码)!

2     石器时代 2.1   痛苦的开始

据说原始人类所使用的工具的产生有很大的随机性。例如这样的情况:最开始大家吃肉肉,一窝蜂扑上去撕咬;后来可能觉得不卫生(也可能是觉得咬起来牙齿疼,也可能是觉得自己每次都咬不过别人),于是按自己牙齿的模样,找些放大比例的动物牙齿(或者石头),尝试着割肉,发现挺好使的,于是工具产生了。

代码界同样有这样的事情发生(产品的童鞋要我们为每个名人设计一句话):

...

if(strcmp(name, "billgates") == 0) {

       printf("Doyou like Win8?");

} else if(strcmp(name, "Stevejobs") == 0) {

       printf("sonice iPhone.");

} else if(strcmp(name, "Zuckerberg")== 0) {

       printf("Welcometo facebook.");

} else {

...

看上去这样没有什么不妥,是不是?

然而,事情远远没有这么简单。

“花心”的产品童鞋总会给我们提点新要求,有木有?他们很可能觉得每个名人都应该充分体现自己的个性,要求为他们增加肢体语言什么的。有木有?

好吧,我们的痛苦从此开始了……

2.2   梦想

我猜想,原始人类估计不像我们现在这么贪婪,他们在寻找牙齿与石头的时候,很可能是在想:老天爷,赐我一把割肉神器吧(而不是:老天爷,赐我一具不用吃饭的肉体吧)!当然,在得到神器的那一天来临之前,我们的原始先祖们,还是不得不继续寻找更锋利的牙齿与石头。

是的,代码界也发生了一些变化:

...

void billgatesShowtime() {

       printf("Do you like Win8?");

       printf("Andput up his hands.");

}

...

if(strcmp(name, "billgates") == 0) {

       BillgatesShowtime();

} else if(strcmp(name, "Stevejobs") == 0) {

       StevejobsShowtime();

} else if(strcmp(name,"Zuckerberg") == 0) {

       ZuckerbergShowtime();

} else {

...

噢,看上去确实好多了,我们可以让老比尔给大家举手示意了,不是吗?

是的,你兴奋了很久,甚至晚上睡觉都带着醉人的笑容。

顺便还做了个梦:你站在云端,觉得孤独,便心血来潮的说:要有比尔,于是比尔出现了;你又说:要有乔布斯,于是乔布斯出现了;你接着说:要有马化腾……

3     青铜器时代

恩,或许在这之前,还要经历一个后石器时代,在那个过程中,我们使用typedef定义函数指针,并建立名字与函数地址关联的数组(或者map),使代码变得更优雅;这确实是一个很大的改善,但仍然还不足以代表设计模式上的进步,所以我们忽视他的存在。

3.1   痛苦的持续

哦,时光悠悠,石器时代过去了。

我们的先祖仍在期待神器,仍在寻找更锋利的割肉工具……

代码界,你跌坐在屏幕前,嘴里念念有词:果然应验了,我TM说“要有马化腾”干毛啊?

是的,可恶的产品童鞋说了,要把马化腾加入这个名人行列,同时还要抱一只企鹅。

在一万只草泥马奔腾过后,你从泥泞的草原上站起来,向着太阳的方向,前进前进前进进……

3.2   曙光

好在先祖们发现了青铜,相比之下,青铜比石头和牙齿更靠谱,还能自己决定着割肉工具的外形(嚯嚯,越拉风越好哇)。

代码界里,你也在进步:

...

class CPeople {

       virtualvoid showtime() = 0;

};

...

class CXiaomage : public CPeople {

       voidshowtime() {

              printf("Fuck360.");

              printf("Doyou like QQ pets?");

       }

};

...

class CFamousPersons {

private:

map<string,CPeople*> peoples;

 

public:

CFamousPersons(){

              peoples.insert(pair<string,CPeople*>("bill gates", new CBillgates()));

              peoples.insert(pair<string,CPeople*>("steve jobs", new CStevejobs()));

              peoples.insert(pair<string,CPeople*>("马化腾", new CXiaomage()));

              …

       }

 

       People*find(string name) {

              map<string,CPeople*>::iterator iter = peoples.find(name);

              if(iter!= peoples.end())

                     returniter->second;

              returnNULL;

       }

};

...

CFamousPersons famousPersons;

People* people = famousPersons.find(name);

 

if(people != NULL) {

       people->showtime();

}

...

咦?代码好像变多了,但我们为你自豪;因为这已经是一个完整的工厂模式的实现了。

是的,代码可读性增强了,逻辑结构也清晰了很多,对不对。关键是你再也不同担心产品给你增加名人,不用担心名人的各种性格和癖好。

于是你睡了个好觉,但你诚惶诚恐,不敢做梦。

4     铁器时代 4.1   愤怒的燃烧

青铜的冶炼和锻造技术已经达到了巅峰。吴钩、鱼肠、干将、莫邪……,喔噢,这已经是割肉神器了不?

仿佛从现在开始,担心先祖的生活已经有点多余了。

是的,因为代码界里,名人的数量已经达到了10000+(名人的各种性格和癖好,也让你震惊到了无以复加)。

你已无数次的被这份名单中人从梦中惊醒,你的生活开始变得枯燥,你的世界渐渐黑白。仿佛你的生活就是为了这份名单而存在(有的名人改名了;有的名人换公司了;有的名人变性了,擦啊啊啊……)。

CFamousPersons已经被神兽草泥马践踏了无数次,而且变成了工程里面个头最大的源代码文件;每次你从peoples里找名人的时候,这份超长的名单几乎亮瞎了你的钛合金眼。

一次次的代码更新,SVN上的代码号直接蹦到了5位数;当你部署代码时,看着运维冒着幽光的怨恨眼神,你叔忍了,但你婶认为绝不能忍;于是你发粪图墙……

4.2   福音

有一天,某位先祖发现自己的神器青铜大剑居然被一柄小匕首斩断了,擦啊,这是什么玩意?超神器?

呵呵,猪脚模式开启了,在代码界,你也发现了“神器”。

你先把这个名单弄到了数据库里(表名famous_persons):

然后,你用这把“神器”大刀阔斧把臃肿的CFamousPersons剁的稀烂。

再然后,你重造了一个轮子:

...

typedef void* (__stdcall*PExportClass)();

class CFamousPersons {

private:

CConnectionconn;

...

       constchar* findPlugin(string name) {

              char*pluginFile =

    
最新技术文章:
 




特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3