本站的sgf棋谱全部以文件形式存储在服务器上,因为对sgf的编辑非常复杂,
数据库中操作太繁琐。另外,网络上的sgf都是文件形式,方便对接。
那么文件存储和数据库存储哪种好?
结论是:
如果文件形式复杂,需要频繁的复杂查询,应该用数据库。
如果文件体积大,主要是读操作,则适合用文件存储。比如html文件,图片文件。
顺序读取的话文件快。检索的话数据库高。
不只是java,所有语言都有这个特点。
在2000年左右,国内还争论过使用数据库还是文件来保存数据。现在已经没有争论了。数据存储就是为了用的。
【文件系统存储数据,与数据库系统存储数据的差别 】
一、文件系统与数据库系统的概念及其发展
1.文件系统
所谓的文件系统简单地说负责存取和管理文件信息的软件结构。例如电脑的硬盘C、D、E、F盘和可以动的存储设备等。文件系统是操作系统用于明确磁盘或分区上的文件的方法和数据结构,即在磁盘上组织文件的方法。也指用于存储文件的磁盘或分区,或文件系统种类。操作系统中负责管理和存储文件信息的软件机构称为文件管理系统,简称文件系统。
文件系统由三部分组成:与文件管理有关软件、被管理文件以及实施文件管理所需数据结构。从系统角度来看,文件系统是对文件存储器空间进行组织和分配,负责文件存储并对存入的文件进行保护和检索的系统。具体地说,它负责为用户建立文件,存入、读出、修改、转储文件,控制文件的存取,当用户不再使用时撤销文件等。
2.数据库系统
数据库系统是由数据库及数据库管理软件组成的系统,它是为适应数据处理的需要而发展起来的一种较为理想的数据处理的核心机构。它是一个实际可运行的存储、维护和应用系统提供数据的软件系统,是存储介质、处理对象和管理系统的集合体。数据库系统的核心是数据库管理系统。
数据库系统一般由4个部分组成:数据库、硬件、软件、人员。
其中数据库是指长期存储在计算机内的,有组织,可共享的数据的集合。硬件是指构成计算机系统的各种物理设备,包括存储所需的外部设备。软件包括操作系统、数据库管理系统及应用程序。人员包括系统分析员和数据库设计人员、应用程序员、最终用户、数据库管理员。
数据库系统有大小之分,常见的大型数据库系统有SQL Server、Oracle、DB2等;中小型数据库系统有Foxpro、Access等。
3.发展过程
数据库发展阶段大致划分为如下几个阶段:人工管理阶段、文件系统阶段、数据库系统阶段、高级数据库阶段。以下主要介绍一下文件系统管理阶段和数据库管理阶段。文件系统阶段中操作系统的出现标志着数据管理步入一个新的时期。在文件系统阶段,数据以文件为单位存储在外存,且由操作系统统一管理。操作系统为用户使用文件提供了友好界面。文件的逻辑结构与物理结构脱钩,程序和数据分离,使数据与程序有了一定的独立性。用户的程序与数据可分别存放在外存储器上,各个应用程序可以共享一组数据,实现了以文件为单位的数据共享。
在数据库系统阶段,人们对数据管理技术提出了更高的要求:希望面向企业或部门,以数据为中心组织数据,减少数据的冗余,提供更高的数据共享能力,同时要求程序和数据具有较高的独立性,当数据的逻辑结构改变时,不涉及数据的物理结构,也不影响应用程序,以降低应用程序研制与维护的费用。数据库技术正是在这样一个应用需求的基础上发展起来的。
通过上面的内容可以看出数据库系统是在文件系统的基础上发展而来的。
二、文件系统存储与数据库系统存储的区别与联系
文件系统与数据库系统的本质区别在于:
文件系统把数据组织成相互独立的数据文件,实现了记录内的结构性,但整体无结构;而数据库系统实现整体数据的结构化。
在文件系统中,数据冗余度大,浪费存储空间,容易造成数据的不一致,但是在数据库系统中,数据是面向整个系统,数据可以被多个用户、多个应用共享使用,减少了数据冗余。文件系统中的文件是为某一特定应用服务的,当要修改数据的逻辑结构时,必须修改应用程序,修改文件结构的定义,数据和程序之间缺乏独立性,数据库系统中,通过DBMS的两级映象实现了数据的物理独立性和逻辑独立性,把数据的定义从程序中分离出去,减少了应用程序的维护和修改。
文件系统和数据库系统均可以长期保存数据,由数据管理软件管理数据,数据库系统是在文件系统基础上发展而来。
数据库系统主要管理数据库的存储、事务以及对数据库的操作。文件系统是操作系统管理文件和存储空间的子系统,主要是分配文件所占的簇、盘块或者建立FAT、管理空间空间等。一般来说数据库系统会调用文件系统来管理自己的数据文件,但也有些数据库系统能够自己管理数据文件,甚至在裸设备上。文件系统是操作系统必须的,而数据库系统只是数据库管理和应用所必需的。
三、总结
综上所述,文件系统和数据库系统之间既有区别又有联系。
其区别在于:
(1)文件系统用文件将数据长期保存在外存上,数据库系统用数据库统一存储数据。
(2)文件系统中的程序和数据有一定的联系,数据库系统中的程序和数据分离。
(3)文件系统用操作系统中的存取方法对数据进行管理,数据库系统用DBMS统一管理和控制数据。
(4)文件系统实现以文件为单位的数据共享,数据库系统实现以记录和字段为单位的数据共享。
其联系在于:
(1)均为数据组织的管理技术。
(2)均由数据管理软件管理数据,程序与数据之间用存取方法进行转换。
(3)数据库系统是在文件系统的基础上发展而来的。
总之,文件系统存储和数据库系统存储各有利弊,两种存储方式都广泛的应用于现实社会中的各个领域。
【php读写txt文件与读写数据库哪个更快?】
读写txt文件与读写数据库哪个更快?
解决办法今天 突然遇到这个问题,在网上找了很久才找到的一篇文章,所以转来了,其实这个问题开始是有些模糊,但仔细想一下还是能猜出一个大概,所以有时候,人的意识可能也很作用!读文件更快还是读数据库更快,能快多少,也搜索过,没见有网友就这个问题答复过,也可能是太简单的缘故,我们本文还是来实测一下,由于时间关系,VC还没装,天缘先用PHP测试了一下,下次有时间在C/C++上补充测试到本文来,因为PHP的底层解析应该也是基于C的,所以估计两者环境测试结果差不多,小问题大收获,现在就来看一下测试过程及结果。测试程序如下://说明1:由于读数据库语句调用简单的封包函数两次,所以把读文件也改成连续调用两次,数据库记录ID为1就在第一条,并且唯一索引。
//说明2:测试两次一次是4K数据,一次是整形数据
set_time_limit(0); function fnGet($filename){ $content = file_get_contents($filename); return $content;}function fnGetContent($filename){ $content = fnGet($filename); return $content;} $times=100000; echo '数据库查询结果: ';//---------------------------------$begin=fnGetMicroTime(); for($i=0;$i<$times;$i++){ $res=$dbcon->mydb_query("SELECT log_Content FROM blog WHERE log_ID='1'"); $row=$dbcon->mydb_fetch_row($res); $content=$row[0];}echo 'fetch_row '.$times.' 次时间:'.(fnGetMicroTime()-$begin).'秒 '; //--------------------------------- $begin=fnGetMicroTime();for($i=0;$i<$times;$i++){ $res=$dbcon->mydb_query("SELECT log_Content FROM blog WHERE log_ID='1'"); $row=$dbcon->mydb_fetch_array($res); $content=$row['log_Content']; }echo 'fetch_array '.$times.' 次时间:'.(fnGetMicroTime()-$begin).'秒 '; //--------------------------------- $begin=fnGetMicroTime();for($i=0;$i<$times;$i++){ $res=$dbcon->mydb_query("SELECT log_Content FROM blog WHERE log_ID='1'"); $row=$dbcon->mydb_fetch_object($res); $content=$row->log_Content; }echo 'fetch_object '.$times.' 次时间:'.(fnGetMicroTime()-$begin).'秒 '; //--------------------------------- $dbcon->mydb_free_results();$dbcon->mydb_disconnect();fnWriteCache('test.txt',$content);echo '直接读文件测试结果: '; //--------------------------------- $begin=fnGetMicroTime();for($i=0;$i<$times;$i++){ $content = fnGetContent('test.txt');}echo 'file_get_contents直接读'.$times.'次时间:'.(fnGetMicroTime()-$begin).'秒 '; //--------------------------------- $begin=fnGetMicroTime();for($i=0;$i<$times;$i++){ $fname = 'test.txt'; if(file_exists($fname)) { $fp=fopen($fname,"r");//flock($fp,LOCK_EX); $file_data=fread($fp, filesize($fname));//rewind($fp); fclose($fp); } $content = fnGetContent('test.txt');} echo 'fopen直接读'.$times.'次时间:'.(fnGetMicroTime()-$begin).'秒 ';
4K大小数据的查询结果:
fetch_row 100000 次时间:16.737720012665秒
fetch_array 100000 次时间:16.661195993423秒
fetch_object 100000 次时间:16.775065898895秒
直接读文件测试结果:
file_get_contents直接读100000次时间:5.4631857872009秒
fopen直接读100000次时间:11.463611125946秒
整形ID查询结果:
fetch_row 100000 次时间:12.812072038651秒
fetch_array 100000 次时间:12.667390108109秒
fetch_object 100000 次时间:12.988099098206秒
直接读文件测试结果:
file_get_contents直接读100000次时间:5.6616430282593秒
fopen直接读100000次时间:11.542816877365秒
测试结论:
1、直接读文件相比数据库查询效率更胜一筹,而且文中还没算上连接和断开的时间。2、一次读取的内容越大,直接读文件的优势会越明显(读文件时间都是小幅增长,这跟文件存储的连续性和簇大小等有关系),这个结果恰恰跟天缘预料的相反,说明MYSQL对更大文件读取可能又附加了某些操作(两次时间增长了近30%),如果只是单纯的赋值转换应该是差异偏小才对。
3、写文件和INSERT几乎不用测试就可以推测出,数据库效率只会更差。
4、很小的配置文件如果不需要使用到数据库特性,更加适合放到独立文件里存取,无需单独创建数据表或记录,很大的文件比如图片、音乐等采用文件存储更为方便,只把路径或缩略图等索引信息放到数据库里更合理一些。
5、PHP上如果只是读文件,file_get_contents比fopen、fclose更有效率,不包括判断存在这个函数时间会少3秒左右。
6、fetch_row和fetch_object应该是从fetch_array转换而来的,天缘没看过PHP的源码,单从执行上就可以说明fetch_array效率更高,这跟网上的说法似乎相反。
实际上在做这个试验之前,从个人经验判断就有了大概的结果,测试完成后则有种豁然开朗的感觉。假定在程序效率和关键过程相当且不计入缓存等措施的条件下,读写任何类型的数据都没有直接操作文件来的快,不论MSYQL过程如何,最后都要到磁盘上去读这个“文件”(记录存储区等效),所以当然这一切的前提是只读内容,无关任何排序或查找操作。