| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1119 人关注过本帖
标题:[转]如何优化数据系统----面对数据冗余
只看楼主 加入收藏
lyxc34
Rank: 2
等 级:论坛游民
帖 子:139
专家分:50
注 册:2011-7-3
结帖率:100%
收藏
 问题点数:0 回复次数:13 
[转]如何优化数据系统----面对数据冗余
发信人: hunter__fox(雁回西楼)
整理人: hunter__fox(2002-05-21 10:06:01)
  注:今天无意中翻到了这篇文章,最近在做个数据库管理系统,因为是新手,以前没做过,碰到了很多问题,特别是数据库建立不规范的问题,看完这篇文章获益良多,特转过来给大家参考参考。高手可以补充补充,新手学习学习,大家共同提高,谢谢!
  从关系数据据的原理来看,是不应当存在数据重复这一现象的。那么,为什么我们的数据库里为什么常常会出现重复的数据呢?我们应当怎样在这一方面来优化数据结构呢?
  首先,让我们看看数据库里出现重复记录的特征吧。如果你的代码里常常出现下面所所述的内容,那么,就证明你的数据库结构有必要进行优化。
一、常常需要使用 RecNo() 这样的函数来取得记录号以便进一步获取一条记录中的数据。
二、数据库中的表很少,基本上一条记录就是一组相对很完整的数据信息,一般情况下,读取信息,不需要从多个表中进行查找。
三、很多时候,在 Browse 或 Grid 中看到的数据表,里面有很多记录的同一字段内容相同或大部分相同。
四、很少使用组合查询或视图。
五、数据库很快就膨胀起来,以至于不得不经常将相对较旧数据从数据库中移出。
六、常常需要使用 Append From Array 这样的批次添加的命令来操作数据库中的记录。
七、表格字段数很多。
八、表格中存在相同含义或相近含义的字段。
九、数据库中存在很多与其它表无关联的表格。
  下面,我们针对以上各种情况,具体分析各自的起因,并通过进一步的挖掘数据之间的关系,来找出一个优化的办法。
  对第一种情况,即,使用绝对记录号的问题。关系数据据库中,从一个最朴素的思想出发,我们可以得出这样一个结论:一个数据库中的数据,是互相关联的。因此,应当没有不能通过这种数据与数据之间的关联来定位的数据记录。在使用 SQL Server 时,很少有机会让我们使用 绝对记录号来操作数据记录,更通常的情况是,我们通过一组表达式来确定我们需要操作的数据对象。在 SQLServer 中,我们的一个表中,如果出现两条完全想同的记录,那么,这个表就很可能再也无法正常使用了――你无法再通过一个表达式来更改其中一条记录。
因此,我们在对于 VFP本身的数据表进行操作时,也应当铭记这样一点:没有完全相同的记录。只要存在不同,我们就可以通过不同之处将它们区分开来,而不必使用 RecNo() 这样的绝对记录号来做这样的事。RecNo() 的作用不是用来在存取数据时定位记录的,它在 VFP中提供出来,是作为另一种用途的,很可惜,没有多少书籍能够提到这一点,以至于初学 VFP的朋友,因为它的好用,而失去了建立正确的关系数据系统的概念。
所以,第一点,我们应当使用表达式来定位记录,而不是用绝对记录号。当然,特殊情况下的例外也是存在的。
  对于第二种情况,一个表格存放一套完整的信息,在初学 VFP时,的确很好用,因为它可让我们的代码更加简单,我们不需要操作多个表,每一种操作,可能都只需要对一个表进行操作,这是从简单到复杂的一个过程。但如果我们只停留在这种水平上,那么,我们就失去了进一步提高自己的数据库设计能力了。这种数据结构的设计,并没有体现出关系数据库中各种数据之间的真正的关系,而只是笼统的将数据硬塞进数据库已。可以想象,在若干时日之后,这种设计方式的弊端暴露出来,整个系统的性能和稳定性将会受到多么大的影响。因为所有有关系的数据在一起,当我们只需要其中极少的一个数据时,我们可能需要访问很多的数据,才能得到我们想要的数据。这对于一个灵巧的数据系统来说,是不能忍受的。因此,我们应当将数据库中所有没有必然关系的数据都分开。一个简单的例子就是员工信息。员工信息可能包含很多字段,例如编号,姓名,年龄,籍贯,身份证号,学历,毕业时间,就职时间,就职前工作时间,职务,性别,婚姻状况以及个人简历,介绍人,加薪记录等等,初时的设计,当然是将它们用一个表存放,这样,我们可以很容易的访问其中任何一部分信息----因为在设计时,我们用于测试的数据库,包含的数据一般都不大,速度还不是不能忍受的。一旦我们在数据库中真的这样做了,那么,随着开发的进一步深入,我们发现,更多是情况下,我们并不是在使用整个数据,使用最多的,是姓名和职务以及编号。那么,我们不是不可以将它们单独作为一个表来存放呢?设想一下,当你的数据库里有了一千个员工的信息时---(上表所有信息在一起,一条记录可能需要一百多字节)在其它地方,我们常常只需要员工姓名,职务和编号(那就只有16字节),其中的数据利用率不到百分之二十。换句话说,我们将这一部分单独作为一个表,将可使系统在这一地方的效率提高五倍。什么样的数据才应该区分开呢?这里有一个强关联与弱关联的区别。当一种信息在极多的情况下,总是各另一种信息在一起使用,那么,它们之间的关系就是强关联,这种情况下,应当将它们存放在一起,这是不用再想的。而弱关联则是指那些在逻辑上存在一定关联,但在使用中却并不一起使用的数据。很明显,弱关系应当在物理上区分开来,就像上表中,毕业时间和就职时间可以分开存放一样。所以,第二点,我们应当在明确数据之间的关系后一步的明确它们是强关联还是弱关联。
  对于第三种情况,有部分可在第二步时就解决――因为它们本是一种数据。另一种情况,就是因为这里的数据是一种多选数据,即,可让用户从一个列表框中来选择的数据。对于他们,如果字段长度小于四字节,那么,可以考虑不理会它们,如果数据长度大于四字节,就可以考虑用一个ID字段一将它们简化。在我的系统中,我常用一个表格来专门存放这类数据――因为它们的数量一般都不多,单独存放似乎有点浪费,这个表我用了这样上字段:(ID i字段区分不同的类型,每一种多选,拥有一个不同的Type值,这样,就在很多地主看不到那些字段了,在财务系统中,常常出现很多相同的报帐名称,它们大多相同,但又不固定,我们就可以用这种方法来解法这一问题,相同的东西,我就让他们只存在一次,表中,只有它们的一个索引号,如果你愿意,甚至索引字段也只用两个字节或一个字节。因此,对于第三种情况,我们可以通过对相同的内容建立索引表来减小它们占用的空间――而且,索引字段是数值型,有利于搜索。
  第四种情况,就是一个很基本的事情了。从 FoxBase过来的人,在开始很长一段时间里,对视图这个东东是不很感冒的。而 VFP作为专用数据库系统开发平台,如果没有使用好视图和Select - SQL语句中的组合查询,那就等于是拿着机枪当鞭炮,浪费资源了。我看到一个朋友,学用Delphi,将一个表中的数据过滤出来,他使用Do语句――我不为他悲哀,我为Delphi感到悲哀,一个很好的数据平台,如果这样使用,还不如不用它,用 Excel也许更好。在 VFP中,我们应当尽可能的使用那些内置的 SQL语句,一来,它们确实与SQL Server是标准语法很相近,二来,它们的效率的确很高,十万条记录以内,它们的速度绝对是一流的。因此,在能用它们完成任务的情况下,应当将它们作
为首选。使用它们,操作的数据,一般不会用 RecNo()这样的函数的,因此,可以确保你的数据是按条件来选择的,而不是记录号。
  数据膨胀的问题,其实在很大程度上是因为数据不够精练。对于一个日期值使用什么格式,一般人会选用日期型字段来存放。其实,更好的办法是使用一个I 型字段来存放。首先,这样让数据的长度减小了一半。另外,这样的数值使用加减运算更直观,我一直这样认为,日期的可加减,并不是开发平台的一个很好的功能,作为对其它开发平台的代码共用,不使用日期直接进行加减应当是一个正确的决定。数据的膨胀,还存在于多表数据雷同上。当一个表中存放了一组信息,在另一个表中存放经过修改的信息,这样只会增加数据管理的复杂,无利于系统的进一步提升性能。排除这种雷同,首先需要对数据系统进行一个完整的分析,弄清楚各种数据是怎样从原始数据转变成为结果数据的,然后才有可能决定,什么样的数据应当保存,什么样的数据不用保存――它们可以在运行时轻易的得到。并不是所有的原始数据都值得保留。当它们只生成一组结果数据的时候,或者说,当没有使用它们生成多组数数据时,它们就没有必要再保留。有两个例子可以作一个简单的说明。考勤系统中,刷卡时间仅生成一个结果数据,那就是一个刷卡号与刷卡时间的对应表,那么,在生成这个对应表后,就没有必要再保留刷卡的原始数据了。而人事系统中,生日这一项,可从身份证号中得到,似乎没有必要保留,但因为身份证中有很多误填的情况,加上农历与公历的不同选择,它们并不是完全有关的,因此,不能说生日这一项就一定来自于身份证号,不能将它从员工信息表中排除(当然,如果系统不需要生日这一信息的话就不用说了)。
  第六点看来与主题无多大关系。但事实上,这一命令是一个很不好的命令,我个人认为,这样一个命令,并不能让系统能更好,相反,它带来了很多不必要的数据。一个数组的数据,一般并不是全部由用户输入的信息,更多的时候,它来自于其它一个表。从第五条我们知道,能自其它地方得到的数据,应当避免存放在表中,那么,我们完全有理由认为,使用 Append From Array这样的命令是不好的数据内容的开始。我们在成批的添加数据时,应当仔细的考虑是否有这样做的必要。任何一种重复,对于数据系统来说,都是一种额外的负担――你改其中一处数据时,也要同步修改其它部份的数据。这是很不划算的一种做法。一个数据系统正常运行的过程是,最常用的情况是一条记录一条记录的添加数据的,成批的添加数据,是很少见的一种行为,看一看网易的论坛,这么多数据,难道是成批的添加上来的吗?不要以为很快能得到很多数据是一件好事。相反,它是一个让人十分担忧的现象,因为它将让你的数据系统很快成为一个大胖子――因为营养过剩。  第七点,表格中字段数很多。一旦字段数多了起来,你就有必要再审视一下这个表的所有数据是否永远在一起使用。很多字段的表格,查询起来,费时也相应的多,但这还不是重点。重点是,这里面很可能就存在重复的内容。化整为零的方案,看来是增加了字段的总量,但在实际使用中,常常能让数据变得更为精练和灵活。还是以人事表为例,将它分为三个表或四个表,应当是一个很好的选择:最常用的姓名、职务和编号作为一个表,身份信息作为一个表,在厂内的信息作为一个表,而那些备注型的内容,如简介、调职记录、奖惩记录则可作为一个表(其实这个表里后两字段的内容用其它方式保存更好)。事实上,化整为零的做法,也能减小整个数据库的大小。
  曾看到一个表格,用来保存员工在厂内的床位信息的,因为一个房间有十六个床位,就有人用了一个十七字段的表格来保存这一信息,一个字段是宿舍号,另外十六个字段就是分别存放一号床到十六号床的使用者。这种情况下,数据的重复情况虽然没有了,但是――编程中的代码要怎么写呢?如果要寻找某人住在哪里,岂不是要:
Select 房号 ;
From 住宿表 ;
Where 床1="某某" Or 床2="某某" Or 床3="某某" ...
那么,如果我的工厂是用一种很大的集体宿舍,一个房间里是五十个床,那怎么是好?再夸张一点,一间房是二百五十四个床,岂不是将一个表的二百五十四个字段用完还不够么?很简单的三个字段就能搞定的数据信息,在这里,就成了一个很不可想象的样子(当然,使用三字段表也不是最好的解决办法)。朋友们可以看看,自己的数据库里,是否存在这样的表呢?也许,没这么夸张,但只要有两个字段相同,就在必要重新设计表的结构了。
  第九点,说到表格之间的关联。这并不是要说我们在设计数据库时,就一定要将近表的关系用永久联接连起来。我们可以用代码来建立临时的关联。但是有一点,那就是表格的关系一定要明确。任何一个完整的数据系统,都将是由一个完全互相关联的数据来构成的。没有哪一种信息能够例外。如果你的数据库里存在两组相互独立的数据,那么,你应当将它们分别安置在不同的数据库中,而不是一个。这对于建立一个完整的数据系统,是十分重要的一步。设计数据结构时,一定要尽可能的将数据间的种种互动关系弄清楚,不要急于去建立数据实体和写代码,那只是最后的工作。一个成功的数据库,在设计完成后,应当是很少改动的,不要因为设计时没有考虑到某些情况,而在写代码的过程中或代码完成后去改动它,那样做,只会让这个系统越来越混乱。曾有一个公司让我为它写一个人事系统,他们的经理问我需我多长时间,我说最少得三个月,而且那是我没有其它的事的情况下。那经理最后找到另一个人来开发这个系统,只用了一个月。但事后,他们因为这个系统又找那位开发者很多次,只是因为现实中的某些情况这个系统不能实现。这个系统最后在使用了十一个月后宣告正式停用。开发者和使用者都对它很失望。开发者说这个公司的要求太多与标准系统不同,而使用者说这个系统不能适应公司内的制度,虽然公司数次调整制度来适应它。而事实上,并不是开发人员的能力问题,也不是公司制度的问题,归根结底的看,还是在开始阶段对现有的人工系统的数据流程没有弄清,以致于需要不断的修正。
  说了这么多废话,其实,看一看,好象也没讲出什么来,乱七八糟的说一大堆,也不知各位朋友在这方面的看法如何?请各自发表一下自己的见解吧。

[ 本帖最后由 lyxc34 于 2011-7-9 09:42 编辑 ]
搜索更多相关主题的帖子: 优化 数据库 如何 
2011-07-09 09:41
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
規範數據庫理論不是這樣說法的,這個人顯然沒學過,只是自己實踐有一些經驗,也算難得。有些是不錯的,有些是不正確的。所謂不應批量輸入數據就是典型的缺乏實戰經驗,他沒碰到到集團公司需要從下級單位批量導入數據進行管理的情況,也沒見過像抄水錶、電錶那種用外設灌入批量數據的情況。什麽是該、什麽是不該,由業務實際情況決定,不是由你寫程序的方便來決定!

關係數據庫三個規範,很多數據庫教材都有講,早在dBASE時代都有介紹了,不是什麽新鮮理論,學數據庫的人是必須知道的。雖然說實踐有一定的靈活性,未必完全遵守第三規範,但第一、第二規範是應該嚴格遵守的。

授人以渔,不授人以鱼。
2011-07-09 11:42
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
對RECNO()的攻擊也是不瞭解計算機檢索機制的猜測之言。道理很簡單,郵遞員找地方,是按門牌號碼快呢,還是按樓房特徵快?不要以為SQL快,就說它的全盤數據庫檢索就能比直接定位快,前者比後者多做了多少工作,自己寫一段代碼實現一下前者的功能就知道。當今的Windows DirectX是中介系統,對屏幕輸出數據都必須要借用它中轉,它確實很快,大家都看到,但別以為它確實能比直接向屏幕寫數據快(這也是以前的中文系統清一色繞過BIOS中斷向屏幕直接寫屏的原因),我們現在快的概念是在計算機硬件速度的提升上實現的,不是同樣機器配置下的比較。

之所以現在的系統不允許程序向硬件直接下指令,是因為管理邏輯的需要。Windows、Unix之類是多任務、多用戶系統,邏輯上不允許每個用戶都對硬件指手劃腳,必須由統一的上司調度工作,這個上司就是操作系統,因此規定應用程序必須用DirectX這樣的協議界面來中轉對硬件下達的指令(其實是迴歸舊計算機的BIOS機制,不再允許向屏幕寫數據了,所以後來的中文系統才要全面改換,直至被Windows壟斷),操作系統在適當的時候分配執行,延遲是十有八九的,哪有比直接下達指令來得快,這是用屁股都想得到的道理。

SQL是C/S類數據庫系統中使用的,它在服務器端運行,邏輯上要求只能向客戶端發送數據副本(這就是“視圖”的來源),不允許客戶端直接操縱數據庫,這個道理與上面所說的中轉機制是一樣的,是這個邏輯下才有儘量避免直接操縱數據庫的理念(視圖編輯好後刷新原數據庫文件時,實際上就是批量導入數據的過程,由此可見主帖原作者對批量輸入數據的攻擊是多麽無稽)。不應該靠RECNO()來篩選記錄是對的,但不是不能用RECNO()來定位單條記錄。正如作者自己所說,數據庫逐條錄入和修改記錄的時候,絕大多數時間就是對單條記錄操作,記錄指針已經定位在這條記錄上,如果偶然離開(取某些相關數據)然後又要返回填寫,你還用for、where之類檢索一遍?傻的!有人用delete where recno()="123"之類刪除特定的一條記錄,有goto 123然後delete快?

一句話,用什麽指令,怎麽用,由實際情況決定。SQL是大型、巨型數據庫管理語言,面向的對象確實不大需要直接操縱數據庫的數據,所以它才不具有那樣特徵的語句和功能;而FP本身就有獨立的數據庫管理功能,面向中、小型數據庫。兩者的定位都不相同。FP可以使用SQL語句、外掛其它數據庫系統,但不等於必須用,根據實際需要,它完全可以不用別的數據庫。現實的企事業信息管理系統,有多少能達到SQL大型數據庫規模的?到那種規模數據庫的時候,也未必非SQL不可啦,可以考虑用Oracle、Informix之类的了。在VFP上綁定SQL語法,非SQL語法不可,用FP自己類似dBASE那樣的語法低人一等似的,這種觀念就很成問題。

[ 本帖最后由 TonyDeng 于 2011-7-9 12:57 编辑 ]

授人以渔,不授人以鱼。
2011-07-09 12:17
lyxc34
Rank: 2
等 级:论坛游民
帖 子:139
专家分:50
注 册:2011-7-3
收藏
得分:0 
我对数据库的发展史,还有硬软件作用机制流程都只懂皮毛,你说的有点深,我要花点时间消化消化,晚点我再写我的理解,再来请教。
2011-07-09 13:10
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
關係數據庫的三個範式:

第一範式

在規範化理論中,關係必須是規範化的。所謂規範化,就是一個把數據之間的複雜聯係代換成二維表格形式的聯係。但形成的表格不得丟失有關數據項之間的關係的信息。用數學語言來描述,所述的表格就是矩形數組。表格應具有如下性質:
(1)表格中每個登記項代表一個數據項,沒有重複組。
(2)表格中每一列裏所有項目屬同一類型,即它們是按列均勻的。
(3)表格中每一列被指定一個相異的名字。
(4)表格中各行相異,不允許有重複的行。
(5)任何時候均可想象行和列具有任意次序,既不影響它們的信息內容,也不影響使用表格的任意功能的語義。

關鍵字應具有以下兩個特性:
(1)唯一標識,即在一個關係的每個元組裏,關鍵字的値必須唯一標識該元組。
(2)無冗餘性,在關鍵字裏不允許存在多餘的屬性。

在實際過程中,在每個元組裏可能有多於一個屬性的集合有上列兩個特徵。這種集合稱為候選關鍵字。而其中之一必須被選定爲主關鍵字,它將在實際上被用來標識該元組(或記錄)。當存在選擇機會時,選取主關鍵字的原則是:
(1)屬性的値必須都是確定的。
(2)屬性的個數應儘可能地少。

任何一個規範化的關係都稱為第一範式(1NF)。

第二範式

如果一個規範化的數據結構,它所有的非關鍵字數據元素都完全依賴於整個關鍵字,我們稱它爲第二範式(2NF)。

第三範式

如果一個屬於第二範式的數據結構,它所有的非關鍵字數據元素都是彼此函數獨立的,換句話說,在所有的非關鍵字數據元素之間,不存在着函數依賴關係,那麽我們稱它爲第三範式(3NF)。

實際操作

即使可能發生某些特殊情況,在分析階段,對數據存貯的邏輯設計,仍然要按照第三範式的原則進行設計,以儘可能簡單的形式表達數據元素之間的關係。雖然用戶可能並不瞭解數據規範化的理論,但是他們熟悉自己的業務和使用的數據,能夠理解這樣的數據表達形式。關鍵在於系統分析員要準確地反映用戶所使用的全部數據以及數據之間的關係,滿足各個用戶對數據庫的使用要求,以及對數據庫的完整性、安全性等方面的要求。在對整個數據庫進行邏輯設計的時候,系統分析員要確保數據庫內部的一致性,也就是不能存在相互矛盾的第三範式的數據存貯結構。

在分析階段所確定的邏輯數據庫,將會有助於設計階段中對數據庫的物理設計,按第三範式組織的數據存貯結構,能夠幫助物理數據庫設計人員瞭解數據之間的關係,更加靈活和容易地用適當的方法建立數據庫。第三範式不僅適用於“關係型數據庫”的建立,而且也適用於其他類型數據庫的建立,甚至適用於文件系統的建立。當然,在設計物理數據庫的時候,在某些特殊情況下,例如對比較多的而且是複雜的查詢要求,為了提高運行效率,縮短響應時間,允許設計人員修改某些第三範式的數據結構。

授人以渔,不授人以鱼。
2011-07-09 14:36
lyxc34
Rank: 2
等 级:论坛游民
帖 子:139
专家分:50
注 册:2011-7-3
收藏
得分:0 
回复 2楼 TonyDeng
  刚才看了下关系数据库规范化理论,专业术语太多,看的很是吃力。总结一下就是1NF→2NF→3NF→BCNF→4NF→5NF.第5范式是最终完美范式,可是一般很少规范到这一层,像VFP处理的数据库要求感觉规范到3NF就足够了。
  还有对于APPEND FROM ARRAY,如果出现了像作者说的导入了过多的无用数据,应该也可以用规范化理论对数据进行规范,然后将无用的数据过滤出来。
2011-07-09 15:04
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
APPEND FROM 之類的數據輸入手段,攔截層面在ARRAY裏的數據,不是這個指令有什麽問題。數據正確與否,在ARRAY中已經有了的東西,那些數據是正確的,APPEND之後也正確,那些數據不正確,你逐條敲進去也同樣不正確。這與用什麽語句無關,那作者打錯板子了。這種說法,就如自己程序寫得不好,卻去怪語言不夠強大,沒能檢測出程序錯誤,有這個道理嗎?

有自然語言可看得,APPEND FROM,既然是FROM,就表明它依賴與來源,來源正確,APPEND才講得上正確。因此,正確性的追蹤在ARRAY裏的數據是怎麽來的。這樣一直追下去,直到人機交互為止。人際交互層次,才是根本源頭。我說,原始數據需要保存,就是指這樣的源頭數據,進計算機之後不管如何演繹,終歸都是可以重新再進行的,修正程序即可修正錯誤,但源頭數據無法讓計算機保證無錯誤。所以,程序設計最關鍵的部分,其實是人機交互部分,要盡一切可能的手段來確保輸入的正確性。

現實灌入數據的方式,是很多的。別說從別的系統導入數據,只要不是新公司、新單位,不是一開始就用你的程序來處理事務,幾乎就無一例外地會遇到批量導入數據的可能性。在這點上不要太天眞。

[ 本帖最后由 TonyDeng 于 2011-7-9 15:25 编辑 ]

授人以渔,不授人以鱼。
2011-07-09 15:08
lyxc34
Rank: 2
等 级:论坛游民
帖 子:139
专家分:50
注 册:2011-7-3
收藏
得分:0 
回复 3楼 TonyDeng
RECNO()是直接读取数据,而不进行查询,那速度应该是更快,不过对于VFP所处理的中小型数据库,区别应该不是很大,所以具体用不用还得看情况,哪个方便用哪个。另外,关系数据库表与表之间都有关联,所以筛选的时候用RECNO()就不那么方便了。
对于SQL,个人感觉在VFP里面起着辅助的作用,例如多条件查询,如果用程序一条条写那可能会很麻烦,用SELECT就比较方便了,但是对于速度提升不会很大,毕竟VFP处理的不是大型数据库。
在大学选择二级语言的时候选了VFP,当时看中的是它可视化的特点,比较形象,虽然也用到程序语言,也要用到算法,可相比C语言那些来说更形象化,学习起来也会相对比较容易。
2011-07-09 15:19
lyxc34
Rank: 2
等 级:论坛游民
帖 子:139
专家分:50
注 册:2011-7-3
收藏
得分:0 
谈了那么多的理论,来个实践,规范化一下。我再开一帖。
2011-07-09 15:21
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
回复 8楼 lyxc34
如果你用過C的流文件處理,或者用過VFP的低級文件處理例程,就知道RECNO()是什麽機理了,那就是從文件最開始直接跳到指定距離那麽簡單的動作,等於告訴指針,從坐標原點開始向正方向1000個字節處是目標(RECNO()就是這個偏移量除以每條記錄的長度,再扣除數據庫固定的頭長度),Goto n就是這樣動作的!這種操作,能慢到哪去?它的速度,受限於操作系統讀取文件數據的速度,如果文件存儲碎片多,速度會受限制,但若是連續的,那是最快速度,不可能有比它更快的速度。

數據庫的處理基礎,是文件!

[ 本帖最后由 TonyDeng 于 2011-7-9 15:39 编辑 ]

授人以渔,不授人以鱼。
2011-07-09 15:31
快速回复:[转]如何优化数据系统----面对数据冗余
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.013767 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved