黑马程序员C语言教程:深入浅出-服务器高并发库libevent5篇范文

时间:2019-05-12 21:03:46下载本文作者:会员上传
简介:写写帮文库小编为你整理了多篇相关的《黑马程序员C语言教程:深入浅出-服务器高并发库libevent》,但愿对你工作学习有帮助,当然你在写写帮文库还可以找到更多《黑马程序员C语言教程:深入浅出-服务器高并发库libevent》。

第一篇:黑马程序员C语言教程:深入浅出-服务器高并发库libevent

标题:深入浅出-服务器高并发库libevent

(二)上一章,我们简单介绍了libevent的环境的安装,和简单的事例。

现在先不要着急分析他的代码,在这里我首先要介绍一个专业名词“Reactor 模式”。

2.1 Reactor的事件处理机制

我们应该很清楚函数的调用机制。1.程序调用函数 2.函数执行

3.程序等待函数将结果和控制权返回给程序 4.程序继续处理和执行

Reactor 被翻译成反应堆,或者反应器。Re-actor 发音。

他是一种事件驱动机制。和普通函数调用的不同之处在于,应用程序不是主动的调用某刻API完成处理,而是恰恰相反,reactor逆置了事件的处理流程,应用程序需要提供相应的接口注册到reacotr上。如果相应的事件发生。Reacotr将主动调用应用程序注册的接口,这些接口就是我们常常说的“回调函数”。

我们使用libevent框架也就是想利用这个框架去注册相应的事件和回调函数。当这些事件发生时,libevent会调用这些注册好的回调函数处理相应的事件(I/O读写、定时和信号)

通过reactor调用函数,不是你主动去调用函数,而是等着系统调用。一句话:“不用打电话给我们,我么会打电话通知你”。

举个例子,你去应聘某xx公司,面试结束后。

“普通函数调用机制”公司的HR比较懒,不会记你的联系方式,那咋办,你只能面试完自己打电话问结果。有没有被录取啊,还是被拒绝了。

“Reacotr”公司的HR就记下了你的联系方式,结果出来后HR会主动打电话通知你。有没有被录取啊,还是悲剧了。你不用自己打电话去问,实际上你也不能,你没有HR的联系方式。

2.2 Reactor模式的优点

Reactor模式是编写高性能网络服务器的必备技术之一,它具有如下的优点:

1)响应快,不必为单个同步时间所阻塞,虽然Reactor本身依然是同步的;

2)编程相对简单,可以最大程度的避免复杂的多线程及同步问题,并且避免了多线程/进程的切换开销;

3)可扩展性,可以方便的通过增加Reactor实例个数来充分利用CPU资源;

4)可复用性,reactor框架本身与具体事件处理逻辑无关,具有很高的复用性;

2.3 Reactor模式的必备条件

1)事件源

Linux上是文件描述符,Windows上就是Socket或者Handle了,这里统一称为“句柄集”;程序在指定的句柄上注册关心的事件,比如I/O事件。

2)event demultiplexer——事件多路分发机制

由操作系统提供的I/O多路复用机制,比如select和epoll。

程序首先将其关心的句柄(事件源)及其事件注册到event demultiplexer上; 当有事件到达时,event demultiplexer会发出通知“在已经注册的句柄集中,一个或多个句柄的事件已经就绪”;

程序收到通知后,就可以在非阻塞的情况下对事件进行处理了。

对应到libevent中,依然是select、poll、epoll等,但是libevent使用结构体eventop进行了封装,以统一的接口来支持这些I/O多路复用机制,达到了对外隐藏底层系统机制的目的。

3)Reactor——反应器

Reactor,是事件管理的接口,内部使用event demultiplexer注册、注销事件;并运行事件循环,当有事件进入“就绪”状态时,调用注册事件的回调函数处理事件。

对应到libevent中,就是event_base结构体。一个典型的Reactor声明方式:

class Reactor { public:

int register_handler(Event_Handler *pHandler, int event);

int remove_handler(Event_Handler *pHandler, int event);

void handle_events(timeval *ptv);

//...};

4)Event Handler——事件处理程序

事件处理程序提供了一组接口,每个接口对应了一种类型的事件,供Reactor在相应的事件发生时调用,执行相应的事件处理。通常它会绑定一个有效的句柄。对应到libevent中,就是event结构体。

下面是两种典型的Event Handler类声明方式,二者互有优缺点。

class Event_Handler { public:

virtual void handle_read()= 0;

virtual void handle_write()= 0;

virtual void handle_timeout()= 0;

virtual void handle_close()= 0;

virtual HANDLE get_handle()= 0;

//...};class Event_Handler { public:

// events maybe read/write/timeout/close.etc

virtual void handle_events(int events)= 0;

virtual HANDLE get_handle()= 0;

//...};

上面讲到了Reactor的基本概念、框架和处理流程,对Reactor有个基本清晰的了解后,再来对比看libevent就会更容易理解了,接下来就正式进入到libevent的代码世界了,加油!

第二篇:黑马程序员C语言教程:带你浅出python爬虫框架scrapy二)

带你深入浅出python爬虫框架scrapy(二)之前我们学习了scrapy的安装,接下来我们先简单的介绍一下使用。

一、创建一个新的Scrapy项目

scrapy startproject itcast 结构如下

│ scrapy.cfg │

└─itcast │ items.py

│ pipelines.py

│ settings.py

│ __init__.py

└─spiders __init__.py

这些文件主要是:

      scrapy.cfg: 项目配置文件

itcast/: 项目python模块, 呆会代码将从这里导入 itcast/items.py: 项目items文件 itcast/pipelines.py: 项目管道文件 itcast/settings.py: 项目配置文件 itcast/spiders: 放置spider的目录

二、定义提取的Item 它通过创建一个scrapy.item.Item类来声明,定义它的属性为scrpy.item.Field对象,就像是一个对象关系映射(ORM).我们通过将需要的item模型化,来控制从dmoz.org获得的站点数据,比如我们要获得站点的名字,url和网站描述,我们定义这三种属性的域。要做到这点,我们编辑在itcast目录下的items.py文件,我们的Item类将会是这样

from scrapy.item import Item, Field class DmozItem(Item): title = Field()link = Field()desc = Field()

三、写一个Spider用来爬行站点,并提取Items

Spider是用户编写的类,用于从一个域(或域组)中抓取信息。

他们定义了用于下载的URL的初步列表,如何跟踪链接,以及如何来解析这些网页的内容用于提取items。要建立一个Spider,你必须为scrapy.spider.BaseSpider创建一个子类,并确定三个主要的、强制的属性:

  name:爬虫的识别名,它必须是唯一的,在不同的爬虫中你必须定义不同的名字.start_urls:爬虫开始爬的一个URL列表。爬虫从这里开始抓取数据,所以,第一次下载的数据将会从这些URLS开始。其他子URL将会从这些起始URL中继承性生成。

 parse():爬虫的方法,调用时候传入从每一个URL传回的Response对象作为参数,response将会是parse方法的唯一的一个参数, 这个方法负责解析返回的数据、匹配抓取的数据(解析为item)并跟踪更多的URL。from scrapy.spider import BaseSpider

class DmozSpider(BaseSpider): name = “dmoz”

allowed_domains = [“dmoz.org”] start_urls = [ “http://#topics-selectors 这是一些XPath表达式的例子和他们的含义

    /html/head/title: 选择HTML文档元素下面的标签。/html/head/title/text(): 选择前面提到的<title>元素下面的文本内容 //td: 选择所有<td>元素</p><p>//div[@class=”mine“]: 选择所有包含 class=”mine“ 属性的div 标签元素</p><p>这只是几个使用XPath的简单例子,但是实际上XPath非常强大。</p><p>为了方便使用XPaths,Scrapy提供XPathSelector 类,有两种口味可以选择,HtmlXPathSelector(HTML数据解析)和XmlXPathSelector(XML数据解析)。为了使用他们你必须通过一个 Response 对象</p><p>对他们进行实例化操作。你会发现Selector对象展示了文档的节点结构。因此,第一个实例化的selector必与根节点或者是整个目录有关。Selectors 有三种方法</p><p>   path():返回selectors列表, 每一个select表示一个xpath参数表达式选择的节点.extract():返回一个unicode字符串,该字符串为XPath选择器返回的数据 re():返回unicode字符串列表,字符串作为参数由正则表达式提取出来</p><p>现在我们尝试从网页中提取数据</p><p>from scrapy.spider import BaseSpider from scrapy.selector import HtmlXPathSelector</p><p>class DmozSpider(BaseSpider): name = ”dmoz“</p><p>allowed_domains = [”dmoz.org“] start_urls = [ ”http://XPathSelector(response)sites = hxs.path('//fieldset/ul/li')#sites = hxs.path('//ul/li')for site in sites: title = site.path('a/text()').extract()link = site.path('a/@href').extract()desc = site.path('text()').extract()#print title, link, desc print title, link</p><p>保存抓取的数据</p><p>保存信息的最简单的方法是通过以下命令来保存数据: scrapy crawl dmoz-o items.json-t json 简单的使用就介绍这了,后面会继续为大家说明高级用法。</p><h2><a name="3" >第三篇:黑马程序员c语言教程:Oracle简介</a></h2><p>9.通过子查询建表 通过子查询建表的例子</p><p>SQL>CREATE TABLE emp_41 AS SELECT id, last_name, userid, start_date FROM s_emp WHERE dept_id = 41;SQL> CREATE TABLE A as select * from B where 1=2;只要表的结构.10.用子查询建表的注意事项</p><p>可以关连多个表及用集合函数生成新表,注意选择出来的字段必须有合法的字段名称,且不能重复。</p><p>用子查询方式建立的表,只有非空NOT NULL的约束条件能继承过来, 其它的约束条件和默认值都没有继承过来.根据需要,可以用alter table add constraint ……再建立其它的约束条件,如primary key等.11.Foreign Key的可选参数ON DELETE CASCADE 在创建Foreign Key时可以加可选参数: ON DELETE CASCADE它的含义是如果删除外键主表里的内容,子表里相关的内容将一起被删除.如果没有ON DELETE CASCADE参数,子表里有内容,父表里的主关键字记录不能被删除掉.12.如果数据库表里有不满足的记录存在,建立约束条件将不会成功.13.给表创建和删除同义词的例子 SQL> CREATE SYNONYM d_sum 2 FOR dept_sum_vu;SQL> CREATE PUBLIC SYNONYM s_dept 2 FOR alice.s_dept;SQL> DROP SYNONYM s_dept;</p><p>十、ORACLE里的数据字典</p><p>1.什么是数据字典?ORACLE的数据字典是数据库的重要组成部分之一,它随着数据库 的产生而产生, 随着数据库的变化而变化, 体现为sys用户下所有的一些表和视图.2.数据字典里存了以下内容: 用户信息</p><p>用户的权限信息</p><p>所有数据对象信息表的约束条件统计分析数据库的视图等 不能手工修改数据字典里的信息.16</p><p>J2EE @ zxw 3.常用的数据字典</p><p>Dictionary 存放所有数据表,视图,同义词名称和解释 Dict_columns 数据字典里字段名称的和解释 Dba_users 用户 Dba_tablespaces 表空间</p><p>Dba_data_files 数据库的文件 Dba_free_space 空闲表空间 Dba_rollback_segs 回滚段</p><p>User_objects 数据对象 User_constraints 约束条件 User_sequences 序列号 User_views 视图 User_indexes 索引 User_synonyms 同义词</p><p>Session_roles 用户的角色 User_role_privs 用户的角色权限 User_sys_privs 用户的系统权限 User_tab_privs 用户的表级权限 V$session 实时用户情况 V$sysstat 实时系统统计 V$sesstat 实时用户统计 V$sgastat 实时SGA使用 V$locked_object 实时锁 V$controlfile 控制文件 V$logfile 日志文件 V$parameter 参数文件 4.数据字典的分类 数据字典四大类别</p><p>User_ 用户下所有数据库对象</p><p>All_ 用户权限范围内所有的数据库对象 Dba_ 所有的数据库对象</p><p>V$Content$nbsp;统计分析数据库的视图 赋于oem_monitor权限非DBA用户也可查询V$*视图</p><p>5.查询数据字典</p><p>SQL> select * from dictionary where instr(comments,'index')>0;SQL> select constraint_name, constraint_type, 2 search_condition, r_constraint_name 3 from user_constraints 4 where table_name = ‘&table_name';十一.控制数据、INSERT(往数据表里插入记录的语句)SQL> insert into 表名(字段名1, 字段名2, ……)values(值1, 值2, ……);SQL> insert into 表名(字段名1, 字段名2, ……)select(字段名1, 字段名2, ……)from 另外的表名 where 条件;可以用&标记变量的方法多次输入记录</p><p>快速插入数据的方法, 一般用于大于128M的数据转移 SQL> insert /*+ append */ into 表名</p><p>select * from 另外的用户名.另外的表名 WHERE 条件;SQL> commit;注意事项:</p><p>用INSERT /*+ APPEND */ 的方法会对target_tablename产生级别为6的独占锁,如果运行此命令时还有对target_tablename的DML操作会排队在它后面, 对OLTP系统在用的表操作是不合适的。17</p><p>J2EE @ zxw 2.插入字符串类型的字段的注意事项: 字符串类型的字段值必须用单引号括起来, 例如: ’GOOD DAY’</p><p>如果字段值里包含单引号’ 需要进行字符串转换, 我们把它替换成两个 单引号’ ’</p><p>字符串类型的字段值超过定义的长度会出错, 最好在插入前进行长度校验 ‘’ 标记是NULL, user 标明当前用户</p><p>日期字段的字段值可以用当前数据库的系统时间SYSDATE, 精确到秒</p><p>用字符串转换成日期型函数TO_DATE(‘2001-08-01’,’YYYY-MM-DD’)TO_DATE()还有很多种日期格式, 可以参看ORACLE DOC.年-月-日 小时:分钟:秒 的格式YYYY-MM-DD HH24:MI:SS NSERT时最大可操作的字符串长度小于等于4000个单字节, 如果要插入更长的字符串, 请考虑字段用CLOB类型, 方法借用ORACLE里自带的DBMS_LOB程序包.3、UPDATE(修改数据表里记录的语句)SQL> UPDATE 表名 SET 字段名1=值1, 字段名2=值2, …… WHERE 条件;如果修改的值N没有赋值或定义时, 将把原来的记录内容清为NULL, 最好在修改前进行非空校验;值N超过定义的长度会出错, 最好在插入前进行长度校验.新功能,可以修改子查询后的结果集</p><p>例子:SQL> update(select * from s_dept)set id=50 where id=60;</p><p>4、DELETE(删除数据表里记录的语句)SQL> DELETE FROM 表名 WHERE 条件;注意:删除记录并不能释放ORACLE里被占用的数据块表空间.它只把那些 被删除的数据块标成unused.如果确实要删除一个大表里的全部记录, 可以用 TRUNCATE 命令, 它可以释放占用的数据块表空间</p><p>SQL> TRUNCATE TABLE 表名;此操作不可回退.5、SQL语句的分类 数据定义语言(DDL):create、alter、drop(创建、修改结构、删除)(其他:rename)数据操纵语言(DML):insert、delete、select、update(增、删、查、改)(其他:truncate)</p><p>数据控制语言(DCL):grant、revoke(授权、回收)、set role 事务控制:commit、rollback、savepoint(其他:lock table、set constraint、set transaction)</p><p>审计控制:audit、noaudit 系统控制:alter system 会话控制:alter session 其他语句:comment(添加注释)、explain plan、analyze、validate、call</p><p>6、ORACLE里事务控制 Commit 提交事务 Rollback 回退事务</p><p>Savepoint 设置断点, 在事务中标记位置, 事务结束, 断点释放</p><p>事务结束的情况遇到commit或者rollback遇到DDL和DCL语句发现错误,如死锁用户退出</p><p>SQL*PLUS系统重启或崩溃 7.DML操作的注意事项 18</p><p>J2EE @ zxw 以上SQL语句对表都加上了行级锁, 确认完成后, 必须加上事物处理结束的命令COMMIT 才能正式生效, 否则改变不一定写入数据库里.行级锁也未能得到释放.如果想撤回这些操作, 可以用命令 ROLLBACK 复原.在运行INSERT, DELETE 和 UPDATE 语句前最好估算一下可能操作的记录范围, 应该把它限定在较小(一万条记录)范围内,.否则ORACLE处理这个事物用到很大的回退段.程序响应慢甚至失去响应.如果记录数上十万以上这些操作, 可以把这些SQL语句分段分次完成, 其间加上COMMIT 确认事物处理.太过频繁的commit不好</p><h2><a name="4" >第四篇:黑马程序员c语言教程:DML语言强化</a></h2><p>sql语言的类型</p><p>数据语言实现数据的crud</p><p>DML语句(Data Manipulation Language)数据库操作语言</p><p>insert update delete select DDL语言 data definition Lanaguage</p><p>create table</p><p>create view index sequence synonym同义词</p><p>truncate table DCL语言 data control language数据语言</p><p>commit rollback savetpointe</p><p>OCA认证 OCP(dba)一起考, 参加oracle的培训 2w Oracle数据库管理员认证专员(OCA):Oracle Certified Associate Oracle数据库管理员认证专家(OCP): Oracle Certified Professional Oracle数据库管理员认证大师(OCM): Oracle Certified Master</p><p>语法: INSERT INTO table [(column [, column...])] VALUES(value [, value...]);</p><p>--1 向表中插入所有列</p><p>insert into emp values(1, 'tom_111', 'enginerr', 7839, sysdate, 5000, 100, 10)--2 向表中插入部分列</p><p>insert into emp(empno, ename, job, hiredate)values(2, 'tom_2222', 'enginerr', sysdate)</p><p>--3 隐式插入空值: 没有写出的列,默认为null值--4 显示插入空值:--5 sql插入语言的地址符 & 取地址符后面相当于一个变量</p><p>mysql语言: preparedStatement语言 SQL> insert into emp(empno, ename, job, hiredate)values(&empno, &ename, &job, &hiredate);输入 empno 的值: 3</p><p>输入 ename 的值: 'tom_ccc' 输入 job 的值: 'job' 输入 hiredate 的值: '22-2月-81' 原值 1: insert into emp(empno, ename, job, hiredate)values(&empno, &ename, &job, &hiredate)新值 1: insert into emp(empno, ename, job, hiredate)values(3, 'tom_ccc', 'job', '22-2月-81')</p><p>&地址符, 可以在任何sql语言中使用.在select 语言中也可以使用地址符</p><p>SQL> select ename, job, &tt from emp;输入 tt 的值: deptno 原值 1: select ename, job, &tt from emp 新值 1: select ename, job, deptno from emp</p><p>--7 批量插入数据--创建一张表</p><p>create table emp10 as</p><p>select * from emp where 1=2;--一次性的将emp中所有10号部门的员工插入到emp10中</p><p>--在insert语言中使用子查询 子查询 不光用在查询套查询, 也可用在DML语句套select语句</p><p>insert into emp10--列完全一样,可以不写</p><p>select * from emp where deptno=10;delete from emp10;</p><p>有关update更新语句</p><p>UPDATE table SET column = value [, column = value,...] [WHERE condition];--列子</p><p>SQL> update emp10 set sal=2300 where empno=7934;</p><p>有关删除数据</p><p>DELETE [FROM] table [WHERE condition];</p><p>delete和truncate表区别</p><p>delete逐条删除 truncate先摧毁表再重建delete语言是DML语言 truncate是DDL</p><p>DML语言可以闪回 做错的并且提交了.可通过闪回,撤销操作</p><p>DDL语言不可以闪回 flashback</p><p>delete是逐条删除,会产生碎片, truncate不会产生碎片</p><p>行移动功能: 要开启闪回功能,必须要开启行移动功能delete不会释放空间 truncate会delete可以回滚 truncate不可以</p><p>oracle delete快 mysql truncate快.实验: 从文件中导入数据, 通过命名delete 和 truncate删除表数据 实验</p><p>从文件中导入数据</p><p>SQL> set timing off;SQL> set feedback off;SQL> drop table testdelete purge;SQL> @c:Sql.sql;SQL> SQL> set timing on;//最后删除数据表的时候,把时间打开,记录时间</p><p>SQL> delete from testdelete;已用时间: 00: 00: 00.03</p><p>从文件中导入数据</p><p>SQL> set timing off;@c:Sql.sql;</p><p>set timing off;</p><p>select count(*)from testdelete;set timing on;//最后删除数据表的时候,把时间打开,记录时间</p><p>truncate table testdelete;已用时间: 00: 00: 00.39</p><p>事务基本概念</p><p>概念</p><p>一个或者多个DML语言组成特点</p><p>要么都成功,要么都失败</p><p>特性</p><p>原子性 一致性 隔离性 持久性</p><p>事物的隔离性 多个客户端同时操作数据库的时, 要隔离他们的操作</p><p>否则:脏读 不可重复读 幻读</p><p>设置不同的搁置级别来解决oracle中的事务</p><p>事务起始标志 DML语言(oracle默认事务似是打开的)2 事务的结束标志</p><p>提交: 显示提交commit</p><p>隐式提交</p><p>1)执行DDL语言</p><p>eg create table语言 还有I个隐式的功能</p><p>提交之前的没有提交的DML语言(insert update)</p><p>2)正常退出</p><p>回滚: 显示 rollback</p><p>隐式 掉电/宕机/非正常退出==系统出错了 oracle事务控制--保存点</p><p>create table testsavepoint(tid number, tname varchar2(20));set feedback on</p><p>insert into testsavepoint values(1, 'tom1');insert into testsavepoint values(2, 'tom2');savepoint a;//创建一个保存点</p><p>insert into testsavepoint values(3, 'tom3a);rollback to savepoint a;</p><p>注意: 回退到savepoint a 前面插入的两条sql语句还没有提交;仍然还在一个事务里面;让事务结束的方法 显示 隐式 SQL> rollback / commit oracle数据的隔离级别问题</p><p>read only ,数据库几乎不做串行化操作,增加了read only SQL99</p><h2><a name="5" >第五篇:黑马程序员c语言教程:Oracle概念(推荐)</a></h2><p>七、在执行SQL语句时绑定变量</p><p>1.接收和定义变量的SQL*PLUS命令 ACCEPT DEFINE UNDEFINE & 2.绑定变量SQL语句的例子(1)SQL> select id, last_name, salary from s_emp where dept_id = &department_number;Enter value for department_number: 10 old 1: select id, last_name, salary from s_emp where dept_id=&department_number;new 1: select id, last_name, salary from s_emp where dept_id= 10 SQL> SET VERIFY OFF | ON;可以关闭和打开提示确认信息old 1和new 1的显示.3.绑定变量SQL语句的例子(2)SQL> select id, last_name, salary from s_emp where title = '&job_title';Enter value for job_title: Stock Clerk 11</p><p>J2EE @ zxw SQL> select id, last_name, salary from s_emp where hiredate >to_date('&start_hire_date','YYYY-MM-DD');Enter value for start_hire_date : 2001-01-01 把绑定字符串和日期类型变量时,变量外面要加单引号 也可绑定变量来查询不同的字段名 输入变量值的时候不要加;等其它符号 4.ACCEPT的语法和例子</p><p>SQL> ACCEPT variable [datatype] [FORMAT] [PROMPT text] [HIDE] 说明: variable 指变量名 datatype 指变量类型,如number,char等 format 指变量显示格</p><p>式 prompt text 可自定义弹出提示符的内容text hide 隐藏用户的输入符号 使用ACCEPT的例子:</p><p>ACCEPT p_dname PROMPT 'Provide the department name: ' ACCEPT p_salary NUMBER PROMPT 'Salary amount: ' ACCEPT pswd CHAR PROMPT 'Password: ' HIDE ACCEPT low_date date format 'YYYY-MM-DD' PROMPT“Enter the low date range('YYYY-MM-DD'):” 4.DEFINE的语法和例子</p><p>SQL> DEFINE variable = value 说明: variable 指变量名 value 指变量值</p><p>定义好了变良值后, 执行绑定变量的SQL语句时不再提示输入变量</p><p>使用DEFINE的例子:</p><p>SQL> DEFINE dname = sales SQL> DEFINE dname DEFINE dname = “sales”(CHAR)SQL> select name from dept where lower(name)='&dname';NAME-------------------------sales sales SQL> UNDEFINE dname SQL> DEFINE dname Symbol dname is UNDEFINED 5.SQL*PLUS里传递参数到保存好的*.sql文件里 SQL> @ /路径名/文件名 参数名1[,参数名2, „.] SQL> start /路径名/文件名 参数名1[,参数名2, „.] 注意事项: 一次最多只能获取9个&变量, 变量名称只能是从&1,&2到&9 变量名后不要加特殊的结束符号</p><p>如果在SQL*PLUS里要把&符号保存在ORACLE数据库里,要修改sql*plus环境变量define SQL> set define off;</p><p>八、概述数据模型和数据库设计 1.系统开发的阶段: Strategy and Analysis Design Build and Document Transition Production 12</p><p>J2EE @ zxw 2.数据模型</p><p>Model of system in client's mind Entity model of client's model Table model of entity model Tables on disk 3.实体关系模型(ERM)概念</p><p>ERM(entity relationship modeling)实体 存有特定信息的目标和事件 例如: 客户,订单等 属性 描述实体的属性 例如: 姓名,电话号码等 关系 两个实体间的关系 例如:订单和产品等 实体关系模型图表里的约定</p><p>Dashed line(虚线)可选参数 “may be”</p><p>Solid line(实线)必选参数 “must be”</p><p>Crow's foot(多线)程度参数 “one or more”</p><p>Single line(单线)程度参数 “one and only one” 4.实体关系模型例子</p><p>每个订单都必须有一个或几个客户</p><p>每个客户可能是一个或几个订单的申请者 5.实体关系的类型</p><p>1:1 一对一 例如: 的士和司机 M:1 多对一 例如: 乘客和飞机 1:M 一对多 例如: 员工和技能 6.校正实体关系的原则</p><p>属性是单一值的, 不会有重复</p><p>属性必须依存于实体, 要有唯一标记</p><p>没有非唯一属性依赖于另一个非唯一的属性 7.定义结构时的注意事项 减少数据冗余</p><p>减少完整性约束产生的问题 确认省略的实体,关系和属性 8.完整性约束的要求</p><p>Primary key 主关键字 唯一非NULL Foreign key 外键 依赖于另一个Primary key,可能为NULL Column 字段名 符合定义的类型和长度</p><p>Constraint 约束条件 用户自定义的约束条件,要符合工作流要求 例如: 一个销售人员的提成不能超过它的基本工资</p><p>Candidate key 候选主关键字 多个字段名可组成候选主关键字, 其组合是唯一和非NULL的</p><p>9.把实体关系图映射到关系数据库对象的方法 把简单实体映射到数据库里的表</p><p>把属性映射到数据库里的表的字段, 标明类型和注释 把唯一标记映射到数据库里的唯一关键字 把实体间的关系映射到数据库里的外键 13</p><p>J2EE @ zxw 其它的考虑: 设计索引,使查询更快</p><p>建立视图,使信息有不同的呈现面, 减少复杂的SQL语句 计划存储空间的分配 重新定义完整性约束条件</p><p>10.实体关系图里符号的含义 PK 唯一关键字的字段 FK 外键的字段</p><p>FK1,FK2 同一个表的两个不同的外键</p><p>FK1,FK1 两个字段共同组成一个外键 NN 非null字段 U 唯一字段</p><p>U1,U1 两个字段共同组成一个唯一字段</p><p>九、创建表</p><p>1.ORACLE常用的字段类型 ORACLE常用的字段类型有</p><p>VARCHAR2(size)可变长度的字符串, 必须规定长度 CHAR(size)固定长度的字符串, 不规定长度默认值为1</p><p>NUMBER(p,s)数字型p是位数总长度, s是小数的长度, 可存负数 最长38位.不够位时会四舍五入.DATE 日期和时间类型</p><p>LOB 超长字符, 最大可达4G CLOB 超长文本字符串 BLOB 超长二进制字符串</p><p>BFILE 超长二进制字符串, 保存在数据库外的文件里是只读的.数字字段类型位数及其四舍五入的结果 原始数值1234567.89 数字字段类型位数 存储的值 Number 1234567.89 Number 12345678 Number 错</p><p>Number(9,1)1234567.9 Number(9,3)错 Number(7,2)错</p><p>Number(5,-2)1234600 Number(5,-4)1230000 Number(*,1)1234567.9 2.创建表时给字段加默认值 和约束条件 创建表时可以给字段加上默认值</p><p>例如 : 日期字段 DEFAULT SYSDATE 这样每次插入和修改时, 不用程序操作这个字段都能得到动作的时间 14</p><p>J2EE @ zxw 创建表时可以给字段加上约束条件 例如: 非空 NOT NULL 不允许重复 UNIQUE 关键字 PRIMARY KEY 按条件检查 CHECK(条件)外键 REFERENCES 表名(字段名)3.创建表的例子</p><p>CREATE TABLE DEPT(EPTNO NUMBER(2)CONSTRAINT PK_DEPT PRIMARY KEY, DNAME VARCHAR2(14), LOC VARCHAR2(13));CREATE TABLE region(ID number(2)NOT NULL PRIMARY KEY, postcode number default '0' NOT NULL, areaname varchar2(30)default ' ' NOT NULL);4.创建表时的命名规则和注意事项</p><p>表名和字段名的命名规则:必须以字母开头,可以含符号A-Z,a-z,0-9,_,$,# 大小写不区分</p><p>不用SQL里的保留字, 一定要用时可用双引号把字符串括起来. 用和实体或属性相关的英文符号长度有一定的限制 注意事项: 建表时可以用中文的字段名, 但最好还是用英文的字段名</p><p>创建表时要把较小的不为空的字段放在前面, 可能为空的字段放在后面 建表时如果有唯一关键字或者唯一的约束条件,建表时自动建了索引 一个表的最多字段个数也是有限制的,254个.5.约束名的命名规则和语法</p><p>约束名的命名规则约束名如果在建表的时候没有指明,系统命名规则是SYS_Cn(n是数字)约束名字符串的命名规则同于表和字段名的命名规则 6.使用约束时的注意事项</p><p>约束里不能用系统函数,如SYSDATE和别的表的字段比较 可以用本表内字段的比较</p><p>想在事务处理后, 做约束的检查</p><p>SQL> alter session set constraints deferred.7.由实体关系图到创建表的例子 s_dept 前提条件:已有region表且含唯一关键字的字段id SQL> CREATE TABLE s_dept(id NUMBER(7)CONSTRAINT s_dept_id_pk PRIMARY KEY, name VARCHAR2(25)CONSTRAINT s_dept_name_nn NOT NULL, region_id NUMBER(7)CONSTRAINT s_dept_region_id_fk REFERENCES region(id), CONSTRAINT s_dept_name_region_id_uk UNIQUE(name, region_id));8.较复杂的创建表例子 15</p><p>J2EE @ zxw SQL> CREATE TABLE s_emp(id NUMBER(7)CONSTRAINT s_emp_id_pk PRIMARY KEY, last_name VARCHAR2(25)CONSTRAINT s_emp_last_name_nn NOT NULL,first_name VARCHAR2(25), userid VARCHAR2 CONSTRAINT s_emp_userid_nn NOT NULL CONSTRAINT s_emp_userid_uk UNIQUE, start_date DATE DEFAULT SYSDATE, comments VARCHAR2(25), manager_id NUMBER(7), title VARCHAR2(25), dept_id NUMBER(7)CONSTRAINT s_emp_dept_id_fk REFERENCES s_dept(id), salary NUMBER(11,2), commission_pct NUMBER(4,2)CONSTRAINT s_emp_commission_pct_ck CHECK(commission_pct IN(10,12.5,15,17.5,20)));</p> </div> </article> <a href="#" tpid="25" target="_self" class="download_card jhcdown" rel="nofollow"> <img class="download_card_pic" src="//static.xiexiebang.com/skin/default/images/icon_word.png" alt="下载黑马程序员C语言教程:深入浅出-服务器高并发库libevent5篇范文word格式文档"> <div class="download_card_msg"> <div class="download_card_title" style="text-decoration:none;">下载黑马程序员C语言教程:深入浅出-服务器高并发库libevent5篇范文.doc</div> <div class="download_card_tip">将本文档下载到自己电脑,方便修改和收藏,请勿使用迅雷等下载。</div> </div> <div class="download_card_btn"> <img src="//static.xiexiebang.com/skin/default/images/icon_download.png"> <div class="downlod_btn_right"> <div>点此处下载文档</div> <p>文档为doc格式</p> </div> </div> </a> <div class="post-tags mt20 mb30"><span>相关专题</span> <a href="/tag/hmcxycyyjc19/" target="_blank">黑马程序员c语言教程</a> <a href="/tag/hmcxybootstrap/" target="_blank">黑马程序员bootstrap</a> <a href="/tag/hmcxycyyjc/" target="_blank">黑马程序员c语言基础</a> </div> <div class="single-info mb40"><span class="hidden-xs ">网址:https://www.xiexiebang.com/a2/2019051221/74bdc9a591368275.html</span><br>声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:645879355@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。 </div> <div class="single-xg mb40"> <div class="con-title"> <h3><a name="6"></a>相关范文推荐</h3> </div> <div class="sticky mb20"> <ul><h2 class="mb20"><a href="/a2/2019051221/d4c29948a09a4cf8.html" target="_blank">黑马程序员c语言教程:多表查询</a></h2><p>1 笛卡尔积 部门表 笛卡尔积产生结果: 行数 两个表相乘列数: 行数相加 原因 条件等值连接select **** from tab1, tab2 where tab1.a = tab2.a 1 select count(e.ename)......</p><h2 class="mb20"><a href="/a2/2019051221/e101b936722e6749.html" target="_blank">黑马程序员c语言教程:Oracle指令大全</a></h2><p>------------------------- --order by的用法 --员工信息按照姓名正序排列 select * from emp order by ename asc; --员工信息按照倒叙排列 select * from emp order by en......</p><h2 class="mb20"><a href="/a2/2019051221/3cd0d9cd6b7909d2.html" target="_blank">黑马程序员c语言教程:Oracle指令大全</a></h2><p>--sql structured query language --DML--Data Manipulation Language--数据操作语言 query information (SELECT), add new rows (INSERT), modify existing rows (UPDAT......</p><h2 class="mb20"><a href="/a2/2019051221/6f671f70e9ca7229.html" target="_blank">黑马程序员c语言教程:Oracle概念</a></h2><p>一、选择行 1. 简单的SELECT 语句 SELECT 字段名1 [AS] '字段名1 解释' FROM table; 2. 处理NULL NVL函数可把NULL转换成其它类型的符号 编程技巧: NVL函数在多条件模糊查询......</p><h2 class="mb20"><a href="/a2/2019051221/46fedb9ba8875c1c.html" target="_blank">黑马程序员c语言教程:Oracle指令大全</a></h2><p>--什么时候用外连接呢?比如领导向你要所有学生的列表,顺便把所属的班级也列出来,就需要外连接 --在Where语句中使用子查询 --- --雇员中最高薪水的人员名称 --1,先求出最高......</p><h2 class="mb20"><a href="/a2/2019051221/be6fb550979c802a.html" target="_blank">黑马程序员c语言教程:SQL函数</a></h2><p>日期 Oracle 中的日期型数据实际含有两个值: 日期和时间。 默认的日期格式是 DD-MON-RR. 函数SYSDATE 返回: 日期 时间 在日期上加上或减去一个数字结果仍为日期。 两个日......</p><h2 class="mb20"><a href="/a2/2019051221/229635d47fad24fb.html" target="_blank">黑马程序员C语言教程:文本三剑客之一(优秀范文五篇)</a></h2><p>文本三剑客之一:awk简介 以下内容在linux可以使用info awk命令获取 简介 awk的功能主要在报表处理方面,有强大的功能。awk命令对文件每次读入一行,默认按照空格分隔来进行处理......</p><h2 class="mb20"><a href="/a2/2019051221/011ced1242b2b4b1.html" target="_blank">黑马程序员c语言教程:Oracle概念(5篇)</a></h2><p>四、从多个表里选取数据记录 1. 数据表间的连接 简单的连接语法: SELECT 字段名1, 字段名2, …… FROM 表名1, [表名2, ……] WHERE 表名1.字段名 = 表名2. 字段名 [ AND …......</p></ul> </div> </div> </div> </div> <div class="right-content-box wow fadeInRight delay300 right-content"> <script src="/e/member/login/loginjs.php"></script> <div class="sidebar"> <div id="sidebar" role="complementary"> <aside id="recent-posts-3" class="widget widget_recent_entries"> <h3 class="widget-title">猜你喜欢</h3> <ul class="new-list"><li><a href="/a2/2019051218/81357ee8742f66fb.html" title="黑马程序员C语言教程:QSignalMapper的使用" target="_blank">黑马程序员C语言教程:QSignalMapper的使用</a></li><li><a href="/a11/2019051416/90aef06bb9cf4012.html" title="黑马程序员c语言教程:过滤和排序数据" target="_blank">黑马程序员c语言教程:过滤和排序数据</a></li><li><a href="/a2/2019051218/c1f13cd69392c33b.html" title="黑马程序员C语言教程:《C语言常用字符串接口总结》" target="_blank">黑马程序员C语言教程:《C语言常用字符串接口总结》</a></li><li><a href="/a2/2019051219/ce4e482b5c88a768.html" title="黑马程序员c语言教程:Oracle指令大全(6)" target="_blank">黑马程序员c语言教程:Oracle指令大全(6)</a></li><li><a href="/a2/2019051219/41598d62554d6c0d.html" title="黑马程序员c语言教程:DML语言简介五篇范文" target="_blank">黑马程序员c语言教程:DML语言简介五篇范文</a></li><li><a href="/a2/2019051221/f0db32f5f326713d.html" title="黑马程序员c语言教程:Oracle指令大全(5篇)" target="_blank">黑马程序员c语言教程:Oracle指令大全(5篇)</a></li><li><a href="/a2/2019051220/cb53af4b6352fbc7.html" title="黑马程序员c语言教程:09_Oracle 11G 安装文档" target="_blank">黑马程序员c语言教程:09_Oracle 11G 安装文档</a></li><li><a href="/a2/2019051220/b6654eb1d5d44f13.html" title="黑马程序员c语言教程:SQL函数[5篇]" target="_blank">黑马程序员c语言教程:SQL函数[5篇]</a></li><li><a href="/a2/2019051221/fc45f85c5e1bd625.html" title="黑马程序员c语言教程:Oracle指令大全(5篇可选)" target="_blank">黑马程序员c语言教程:Oracle指令大全(5篇可选)</a></li><li><a href="/a2/2019051221/73e0c4ad6c4479f3.html" title="黑马程序员c语言教程:过滤和排序数据" target="_blank">黑马程序员c语言教程:过滤和排序数据</a></li></ul> </aside> </div> </div> </div> </div> </div> </section> <section id="footer" class="p30"> <div class="container"> <div class="footer-top clearfix"> <div class="copyr"> <div class="footer-menu clearfix mb10"> <ul class="footer-menu-con"> <li><a href="/a1/">1号文库</a></li><li><a href="/a2/">2号文库</a></li><li><a href="/a3/">3号文库</a></li><li><a href="/a4/">4号文库</a></li><li><a href="/a5/">5号文库</a></li><li><a href="/a6/">6号文库</a></li><li><a href="/a7/">7号文库</a></li><li><a href="/a8/">8号文库</a></li><li><a href="/a9/">9号文库</a></li><li><a href="/a10/">10号文库</a></li><li><a href="/a11/">11号文库</a></li><li><a href="/a12/">12号文库</a></li><li><a href="/a13/">13号文库</a></li><li><a href="/a14/">14号文库</a></li><li><a href="/a15/">15号文库</a></li> </ul> </div> <p>Copyright © 2018 <a href="/">写写帮文库</a> All Rights Reserved   <a target="_blank" href="http://www.beian.miit.gov.cn" rel="nofollow"> 浙ICP备11058632号</a>   <script type="text/javascript" src="//static.xiexiebang.com/skin/default/js/tj.js"></script></p> </div> </div> </div> </section> <script type='text/javascript' src='//static.xiexiebang.com/skin/default/js/superfish.js'></script> <script type='text/javascript' src='//static.xiexiebang.com/skin/default/js/jquery.slicknav.js'></script> <script type='text/javascript' src='//static.xiexiebang.com/skin/default/js/xs.js'></script> <div class="right_bar hidden-xs "> <ul> <li class="rtbar_li1" style="left: 0px;"><a><img src="//static.xiexiebang.com/skin/default/images/rtbar_liicon3.png"><span id="call_tel"></span></a></li> <li class="rtbar_li2"> <a href="javascript:void(0);"> <img src="//static.xiexiebang.com/skin/default/images/rtbar_liicon4.png"> </a> <div class="rtbar_shwx" style="display: none;"> <img width="188" height="188" alt="微信二维码" src="//static.xiexiebang.com/skin/default/images/wechat.png"> </div> </li> <li class="rtbar_li3" style="left: 0px;"> <a href="tencent://message/?uin=2261362615&Menu=yes"> <img src="//static.xiexiebang.com/skin/default/images/rtbar_liicon2.png"> 点击咨询 </a> </li> <li class="rtbar_li5"><a href="#1">第一篇</a></li> <li class="rtbar_li6"><a href="#2">第二篇</a></li> <li class="rtbar_li7"><a href="#3">第三篇</a></li> <li class="rtbar_li8"><a href="#4">第四篇</a></li> <li class="rtbar_li9"><a href="#5">第五篇</a></li> <li class="rtbar_li10"><a href="#6">更 多</a></li> <li class="rtbar_li4 gotop"> <a href=""><img src="//static.xiexiebang.com/skin/default/images/rtbar_liicon1.png"> </a></li> </ul> </div> </body> </html>