数据库,简而言之可视为电子化的文件柜——存储电子文件的处所,用户可以对文件中的数据进行新增、截取、更新、删除等 *** 作。
关系型数据库主要有:
Oracle、DB2、Microsoft SQL Server、Microsoft Access、MySQL等等。
非关系型数据库主要有:
NoSql、Cloudant、MongoDb、redis、HBase等等。
扩展资料:
非关系型数据库的优势:
1、性能高:NOSQL是基于键值对的,可以想象成表中的主键和值的对应关系,而且不需要经过SQL层的解析,所以性能非常高。
2、可扩展性好:同样也是因为基于键值对,数据之间没有耦合性,所以非常容易水平扩展。
关系型数据库的优势:
1、可以复杂查询:可以用SQL语句方便的在一个表以及多个表之间做非常复杂的数据查询。
2、事务支持良好:使得对于安全性能很高的数据访问要求得以实现。
参考资料来源:百度百科-数据库
存储过程分为四类;系统存储过程、用户定义存储过程、临时存储过程(以“#”或“##”为前缀)、扩展存储过程。
常用的系统存储过程的使用:
(1)sp_helpdb 用于查看数据库名称和大小。
(2)sp_helptext 用于显示规则、默认值、未加密的存储过程、用户定义函数、触发器或视图的文本。
(3)sp_renamedb 用于重命名数据库。
(4)sp_rename 用于更改当前数据库中用户创建对象(如表、列或用户定义数据类型)的名称。
(5)sp_helplogins 查看所有数据库用户登录信息。
(6)sp_helpsrvrolemember 用于以查看所有数据库用户所属的角色信息。
就列这些常用的了,其他你自己慢慢找资料看看。
本文阐述了怎么使用DBMS存储过程 阐述了使用存储过程的基本的和高级特性 比如返回ResultSet 本文假设你对DBMS和JDBC已经非常熟悉 也假设你能够毫无障碍地阅读其它语言写成的代码(即不是Java的语言) 但是 并不要求你有任何存储过程的编程经历
存储过程是指保存在数据库并在数据库端执行的程序 你可以使用特殊的语法在Java类中调用存储过程 在调用时 存储过程的名称及指定的参数通过JDBC连接发送给DBMS 执行存储过程并通过连接(如果有)返回结果
使用存储过程拥有和使用基于EJB或CORBA这样的应用服务器一样的好处 区别是存储过程可以从很多流行的DBMS中免费使用 而应用服务器大都非常昂贵 这并不只是许可证费用的问题 使用应用服务器所需要花费的管理 编写代码的费用 以及客户程序所增加的复杂性 都可以通过DBMS中的存储过程所整个地替代
你可以使用Java Python Perl或C编写存储过程 但是通常使用你的DBMS所指定的特定语言 Oracle使用PL/SQL PostgreSQL使用pl/pgsql DB 使用Procedural SQL 这些语言都非常相似 在它们之间移植存储过程并不比在Sun的EJB规范不同实现版本之间移植Session Bean困难 并且 存储过程是为嵌入SQL所设计 这使得它们比Java或C等语言更加友好地方式表达数据库的机制
因为存储过程运行在DBMS自身 这可以帮助减少应用程序中的等待时间 不是在Java代码中执行 个或 个SQL语句 而只需要在服务器端执行 个存储过程 网络上的数据往返次数的减少可以戏剧性地优化性能
使用存储过程
简单的老的JDBC通过CallableStatement类支持存储过程的调用 该类实际上是PreparedStatement的一个子类 假设我们有一个poets数据库 数据库中有一个设置诗人逝世年龄的存储过程 下面是对老酒鬼Dylan Thomas(old soak Dylan Thomas 不指定是否有关典故 文化 请批评指正 译注)进行调用的详细代码
try{ int age = ; String poetName = dylan thomas ; CallableStatement proc = connection prepareCall( { call set_death_age( ) } ); proc setString( poetName); proc setInt( age); cs execute();}catch (SQLException e){ // }
传给prepareCall方法的字串是存储过程调用的书写规范 它指定了存储过程的名称 ?代表了你需要指定的参数
和JDBC集成是存储过程的一个很大的便利 为了从应用中调用存储过程 不需要存根(stub)类或者配置文件 除了你的DBMS的JDBC驱动程序外什么也不需要
当这段代码执行时 数据库的存储过程就被调用 我们没有去获取结果 因为该存储过程并不返回结果 执行成功或失败将通过例外得知 失败可能意味着调用存储过程时的失败(比如提供的一个参数的类型不正确) 或者一个应用程序的失败(比如抛出一个例外指示在poets数据库中并不存在 Dylan Thomas )
结合SQL *** 作与存储过程
映射Java对象到SQL表中的行相当简单 但是通常需要执行几个SQL语句 可能是一个SELECT查找ID 然后一个INSERT插入指定ID的数据 在高度规格化(符合更高的范式 译注)的数据库模式中 可能需要多个表的更新 因此需要更多的语句 Java代码会很快地膨胀 每一个语句的网络开销也迅速增加
将这些SQL语句转移到一个存储过程中将大大简化代码 仅涉及一次网络调用 所有关联的SQL *** 作都可以在数据库内部发生 并且 存储过程语言 例如PL/SQL 允许使用SQL语法 这比Java代码更加自然 下面是我们早期的存储过程 使用Oracle的PL/SQL语言编写
create procedure set_death_age(poet VARCHAR poet_age NUMBER)poet_id NUMBER;beginSELECT id INTO poet_id FROM poets WHERE name = poet;INSERT INTO deaths (mort_id age) VALUES (poet_id poet_age);end set_death_age;
很独特?不 我打赌你一定期待看到一个poets表上的UPDATE 这也暗示了使用存储过程实现是多么容易的一件事情 set_death_age几乎可以肯定是一个很烂的实现 我们应该在poets表中添加一列来存储逝世年龄 Java代码中并不关心数据库模式是怎么实现的 因为它仅调用存储过程 我们以后可以改变数据库模式以提高性能 但是我们不必修改我们代码
下面是调用上面存储过程的Java代码
public static void setDeathAge(Poet dyingBard int age)throws SQLException{ Connection con = null; CallableStatement proc = null;
try {con = connectionPool getConnection();proc = con prepareCall( { call set_death_age( ) } );proc setString( dyingBard getName());proc setInt( age);proc execute(); } finally {try{ proc close();}catch (SQLException e) {}con close(); }}
为了确保可维护性 建议使用像这儿这样的static方法 这也使得调用存储过程的代码集中在一个简单的模版代码中 如果你用到许多存储过程 就会发现仅需要拷贝 粘贴就可以创建新的方法 因为代码的模版化 甚至也可以通过脚本自动生产调用存储过程的代码
Functions
存储过程可以有返回值 所以CallableStatement类有类似getResultSet这样的方法来获取返回值 当存储过程返回一个值时 你必须使用registerOutParameter方法告诉JDBC驱动器该值的SQL类型是什么 你也必须调整存储过程调用来指示该过程返回一个值
下面接着上面的例子 这次我们查询Dylan Thomas逝世时的年龄 这次的存储过程使用PostgreSQL的pl/pgsql
create function snuffed_it_when (VARCHAR) returns integer declarepoet_id NUMBER;poet_age NUMBER;begin first get the id associated with the poet SELECT id INTO poet_id FROM poets WHERE name = $ ; get and return the age SELECT age INTO poet_age FROM deaths WHERE mort_id = poet_id;return age;end; language pl/pgsql ;
另外 注意pl/pgsql参数名通过Unix和DOS脚本的$n语法引用 同时 也注意嵌入的注释 这是和Java代码相比的另一个优越性 在Java中写这样的注释当然是可以的 但是看起来很凌乱 并且和SQL语句脱节 必须嵌入到Java String中
下面是调用这个存储过程的Java代码
connection setAutoCommit(false);CallableStatement proc =connection prepareCall( { = call snuffed_it_when() } );proc registerOutParameter( Types INTEGER);proc setString( poetName);cs execute();int age = proc getInt( );
如果指定了错误的返回值类型会怎样?那么 当调用存储过程时将抛出一个RuntimeException 正如你在ResultSet *** 作中使用了一个错误的类型所碰到的一样
复杂的返回值
关于存储过程的知识 很多人好像就熟悉我们所讨论的这些 如果这是存储过程的全部功能 那么存储过程就不是其它远程执行机制的替换方案了 存储过程的功能比这强大得多
当你执行一个SQL查询时 DBMS创建一个叫做cursor(游标)的数据库对象 用于在返回结果中迭代每一行 ResultSet是当前时间点的游标的一个表示 这就是为什么没有缓存或者特定数据库的支持 你只能在ResultSet中向前移动
某些DBMS允许从存储过程中返回游标的一个引用 JDBC并不支持这个功能 但是Oracle PostgreSQL和DB 的JDBC驱动器都支持在ResultSet上打开到游标的指针(pointer)
设想列出所有没有活到退休年龄的诗人 下面是完成这个功能的存储过程 返回一个打开的游标 同样也使用PostgreSQL的pl/pgsql语言
create procedure list_early_deaths () return refcursor as declaretoesup refcursor;beginopen toesup forSELECT poets name deaths ageFROM poets deaths all entries in deaths are for poets but the table might bee generic WHERE poets id = deaths mort_idAND deaths age < ;return toesup;end; language plpgsql ;
下面是调用该存储过程的Java方法 将结果输出到PrintWriter
PrintWriter:
static void sendEarlyDeaths(PrintWriter out){ Connection con = null; CallableStatement toesUp = null; try {con = ConnectionPool getConnection();
// PostgreSQL needs a transaction to do this con setAutoCommit(false);
// Setup the call CallableStatement toesUp= connection prepareCall( { = call list_early_deaths () } );toesUp registerOutParameter( Types OTHER);getResults execute();
ResultSet rs = (ResultSet) getResults getObject( );while (rs next()){ String name = rs getString( ); int age = rs getInt( ); out println(name + was + age + years old );}rs close(); } catch (SQLException e) {// We should protect these calls toesUp close();con close(); }}
因为JDBC并不直接支持从存储过程中返回游标 我们使用Types OTHER来指示存储过程的返回类型 然后调用getObject()方法并对返回值进行强制类型转换
这个调用存储过程的Java方法是mapping的一个好例子 Mapping是对一个集上的 *** 作进行抽象的方法 不是在这个过程上返回一个集 我们可以把 *** 作传送进去执行 本例中 *** 作就是把ResultSet打印到一个输出流 这是一个值得举例的很常用的例子 下面是调用同一个存储过程的另外一个方法实现
public class ProcessPoetDeaths{ public abstract void sendDeath(String name int age);}
static void mapEarlyDeaths(ProcessPoetDeaths mapper){ Connection con = null; CallableStatement toesUp = null; try {con = ConnectionPool getConnection();con setAutoCommit(false);
CallableStatement toesUp= connection prepareCall( { = call list_early_deaths () } );toesUp registerOutParameter( Types OTHER);getResults execute();
ResultSet rs = (ResultSet) getResults getObject( );while (rs next()){ String name = rs getString( ); int age = rs getInt( ); mapper sendDeath(name age);}rs close(); } catch (SQLException e) {// We should protect these calls toesUp close();con close(); }}
这允许在ResultSet数据上执行任意的处理 而不需要改变或者复制获取ResultSet的方法
static void sendEarlyDeaths(final PrintWriter out){ ProcessPoetDeaths myMapper = new ProcessPoetDeaths() {public void sendDeath(String name int age){ out println(name + was + age + years old );} }; mapEarlyDeaths(myMapper);}
这个方法使用ProcessPoetDeaths的一个匿名实例调用mapEarlyDeaths 该实例拥有sendDeath方法的一个实现 和我们上面的例子一样的方式把结果写入到输出流 当然 这个技巧并不是存储过程特有的 但是和存储过程中返回的ResultSet结合使用 是一个非常强大的工具
结论
存储过程可以帮助你在代码中分离逻辑 这基本上总是有益的 这个分离的好处有
快速创建应用 使用和应用一起改变和改善的数据库模式
数据库模式可以在以后改变而不影响Java对象 当我们完成应用后 可以重新设计更好的模式
存储过程通过更好的SQL嵌入使得复杂的SQL更容易理解
编写存储过程比在Java中编写嵌入的SQL拥有更好的工具——大部分编辑器都提供语法高亮!
存储过程可以在任何SQL命令行中测试 这使得调试更加容易
并不是所有的数据库都支持存储过程 但是存在许多很棒的实现 包括免费/开源的和非免费的 所以移植并不是一个问题 Oracle PostgreSQL和DB 都有类似的存储过程语言 并且有在线的社区很好地支持
存储过程工具很多 有像TOAD或TORA这样的编辑器 调试器和IDE 提供了编写 维护PL/SQL或pl/pgsql的强大的环境
lishixinzhi/Article/program/Java/hx/201311/25906
关系数据库、非关系型数据库。
1、关系数据库
特点:数据集中控制;减少数据冗余等。
适用范围:对于结构化数据的处理更合适,如学生成绩、地址等,这样的数据一般情况下需要使用结构化的查询。
2、非关系数据库
特点:易扩展;大数据量,高性能;灵活的数据模型等。
使用范围:据模型比较简单;需要灵活性更强的IT系统;对数据库性能要求较高。
扩展资料:
非关系数据库的分类:
1、列存储数据库
这部分数据库通常是用来应对分布式存储的海量数据。键仍然存在,但是它们的特点是指向了多个列。这些列是由列家族来安排的。如:Cassandra, HBase, Riak。
2、文档型数据库
文档型数据库的灵感是来自于Lotus Notes办公软件的,而且它同第一种键值存储相类似。该类型的数据模型是版本化的文档,半结构化的文档以特定的格式存储,比如JSON。文档型数据库可 以看作是键值数据库的升级版,允许之间嵌套键值。而且文档型数据库比键值数据库的查询效率更高。如:CouchDB, MongoDb 国内也有文档型数据库SequoiaDB,已经开源。
参考资料来源:百度百科-数据库
参考资料来源:百度百科-NoSQL
模型设计中,数据的存放方式通常有两种:多行存放和多列存放。
多行存放指的是将数据按照不同的实例或时间周期,分别存放在不同的行里。这种方式对于数据的按行分析非常方便,可以轻松计算出每个实例或时间周期的平均值、总和、变化趋势等等。但是,如果要进行按列的 *** 作,就需要将数据转置成多列存放的形式,显得比较麻烦。
多列存放则是将数据按照不同的属性或指标,分别存放在不同的列里。这种方式对于数据的按列分析非常方便,可以轻松计算出每种属性或指标的平均值、总和、变化趋势等等。同时,如果需要进行按行的 *** 作,也比较容易,只需要将数据旋转成多行存放的形式即可。
总的来说,多行存放适合按行分析,多列存放适合按列分析。实际应用中需要根据具体情况选择合适的存放方式。
列存储——有别于传统的关系型数据库,Sybase IQ是按照数据表中的列来存储与访问数据的。基于列来读取数据,即使在数据不断膨胀的情况下,你也只须读出你想要了解的数据,避免了重复的全面扫描,显著提供查询速度,进而提升了性能指数P;同时,由于同一列中的所有数据域有相同的数据类型,因此,每一列都可以以更优化的效率和检索进行压缩,从而降低了占用的资源T。
数据压缩——正是由于数据按列存储,相邻的字段值具有相同的数据类型,所以压缩更容易,通常能得到大于50%的压缩。在海量数据下,随着数据的大幅压缩,所占用的空间等资源成本会显著减少。因此,更大的压缩比,加上大页面,使得Sybase IQ在获得优良查询性能的同时,减少了对存储空间的需求,因此占用的资源T也大大降低了。
丰富的索引——传统的关系型数据库引擎只能一对一地解决问题,在数据爆炸的今天,如此“大海捞针”似的查询会令反应速度非常迟缓。而Sybase IQ针对数据仓库应用有多种不同的索引技术,并且这些技术中的每一个都与数据仓库的查询问题相吻合,从而显著减少给定查询或更新的工作量,加快查询速度,自然带动性能P的提升。
Multiplex可扩展能力——Sybase IQ的Multiplex组件增加了在单一的Sybase IQ环境中支持多个SMP机器节点的功能,显著地减轻了进程与内存负担。因此,在信息飞速增长的商业社会,它允许数据仓库从基础开始扩展,从很小的规模扩展到非常巨大的规模,拥有卓越的可扩展能力,避免了数据爆炸带来的更新和不便。
总之,正是凭借以上引领未来的核心科技,Sybase IQ 在保证数据压缩的目标下,能够同时提高查询性能。因此,不论以S/T(即数据库压缩比)、P/T,还是从整体SPoT公式来看,Sybase IQ 都拥有更高的绿色数据指标,是“绿色数据库”的完美体现。
信息飞速膨胀的时代呼唤有效利用资源的绿色科技。绿色数据库Sybase IQ是对传统商业智能软件的挑战,引领了未来关系型数据库的发展方向,其低成本、高效能的绿色效应必将促进企业健康持久成长,营造和谐持续发展的绿色信息环境。
1、数据仓库是面向主题的; *** 作型数据库的数据组织面向事务处理任务,而数据仓库中的数据是按照一定的主题域进行组织。主题是指用户使用数据仓库进行决策时所关心的重点方面,一个主题通常与多个 *** 作型信息系统相关。
2、数据仓库是集成的,数据仓库的数据有来自于分散的 *** 作型数据,将所需数据从原来的数据中抽取出来,进行加工与集成,统一与综合之后才能进入数据仓库;
数据仓库中的数据是在对原有分散的数据库数据抽取、清理的基础上经过系统加工、汇总和整理得到的,必须消除源数据中的不一致性,以保证数据仓库内的信息是关于整个企业的一致的全局信息。
数据仓库的数据主要供企业决策分析之用,所涉及的数据 *** 作主要是数据查询,一旦某个数据进入数据仓库以后,一般情况下将被长期保留,也就是数据仓库中一般有大量的查询 *** 作,但修改和删除 *** 作很少,通常只需要定期的加载、刷新。
数据仓库中的数据通常包含历史信息,系统记录了企业从过去某一时点(如开始应用数据仓库的时点)到当前的各个阶段的信息,通过这些信息,可以对企业的发展历程和未来趋势做出定量分析和预测。
3、数据仓库是不可更新的,数据仓库主要是为决策分析提供数据,所涉及的 *** 作主要是数据的查询;
4、数据仓库是随时间而变化的,传统的关系数据库系统比较适合处理格式化的数据,能够较好的满足商业商务处理的需求。稳定的数据以只读格式保存,且不随时间改变。
5、汇总的。 *** 作性数据映射成决策可用的格式。
6、大容量。时间序列数据集合通常都非常大。
7、非规范化的。Dw数据可以是而且经常是冗余的。
8、元数据。将描述数据的数据保存起来。
9、数据源。数据来自内部的和外部的非集成 *** 作系统。
数据仓库,是在数据库已经大量存在的情况下,为了进一步挖掘数据资源、为了决策需要而产生的,它并不是所谓的“大型数据库”。数据仓库的方案建设的目的,是为前端查询和分析作为基础,由于有较大的冗余,所以需要的存储也较大。为了更好地为前端应用服务,数据仓库往往有如下几点特点:
1效率足够高。数据仓库的分析数据一般分为日、周、月、季、年等,可以看出,日为周期的数据要求的效率最高,要求24小时甚至12小时内,客户能看到昨天的数据分析。由于有的企业每日的数据量很大,设计不好的数据仓库经常会出问题,延迟1-3日才能给出数据,显然不行的。
2数据质量。数据仓库所提供的各种信息,肯定要准确的数据,但由于数据仓库流程通常分为多个步骤,包括数据清洗,装载,查询,展现等等,复杂的架构会更多层次,那么由于数据源有脏数据或者代码不严谨,都可以导致数据失真,客户看到错误的信息就可能导致分析出错误的决策,造成损失,而不是效益。
3扩展性。之所以有的大型数据仓库系统架构设计复杂,是因为考虑到了未来3-5年的扩展性,这样的话,未来不用太快花钱去重建数据仓库系统,就能很稳定运行。主要体现在数据建模的合理性,数据仓库方案中多出一些中间层,使海量数据流有足够的缓冲,不至于数据量大很多,就运行不起来了。
从上面的介绍中可以看出,数据仓库技术可以将企业多年积累的数据唤醒,不仅为企业管理好这些海量数据,而且挖掘数据潜在的价值,从而成为通信企业运营维护系统的亮点之一。正因为如此,
广义的说,基于数据仓库的决策支持系统由三个部件组成:数据仓库技术,联机分析处理技术和数据挖掘技术,其中数据仓库技术是系统的核心,在这个系列后面的文章里,将围绕数据仓库技术,介绍现代数据仓库的主要技术和数据处理的主要步骤,讨论在通信运营维护系统中如何使用这些技术为运营维护带来帮助。
4面向主题
*** 作型数据库的数据组织面向事务处理任务,各个业务系统之间各自分离,而数据仓库中的数据是按照一定的主题域进行组织的。主题是与传统数据库的面向应用相对应的,是一个抽象概念,是在较高层次上将企业信息系统中的数据综合、归类并进行分析利用的抽象。每一个主题对应一个宏观的分析领域。数据仓库排除对于决策无用的数据,提供特定主题的简明视图。
以上就是关于数据库的类型都有哪些全部的内容,包括:数据库的类型都有哪些、数据库中的存储过程怎么用 啊!!求解.....、Java数据库程序中的存储过程设计等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)