主题:ILikefox狐话连篇
Ilikefox
[专家分:5770] 发布于 2010-01-30 19:45:00
我们想象一家书店,里面摆放了好多书架,书架上一层一层许多书。一进书店是个柜台,柜台后工作人员正在等候顾客光临。你进了书店要买一本张洪举的书,现在有两种方式实现目的。
方式1. Locate(或者Seek)的方式。问工作人员,"我要一本张洪举的权威指南"(Locate for 张洪举的权威指南),“哦,稍等一下。”......经过寻找,工作人员已经知道书的位置(即定位记录指针到对应的记录号上)。“有吗?”(?found()),“第3排书架下面的第2层中间”。于是你走到那里,取到了想要的书。
方式2. SQL-Select的方式。对工作人员说,“拿一本张洪举的权威指南给我。”(Select 书 from 书店 where 张洪举的权威指南),“好的,稍等一下。”很快工作人员把书交到你手里。
方式1中工作人员只是指明你要的书的位置(即定位记录指针到对应的记录号上),书还在那个位置,下一步要你去拿。
方式2中工作人员把书直接拿给你(从表中取出数据生成结果集),你不需要了解书具体在哪里(记录号是多少)。
再看复杂一点的,你要所有VFP的书。
方式1. 问工作人员,"我要所有VFP的书"(Locate for VFP的书),“哦,第3排书架就有”(定位到第1条符合条件的记录)。你走到那里,取到了想要的书。接着又问"VFP的书还有什么地方有?"(continue),“第7排书架也有”(定位到第2条符合条件的记录),你走到那里,又取到了想要的书。接着再问"VFP的书还有什么地方有?"(continue)......
方式2. 对工作人员说,“拿所有VFP的书给我。”(Select 书 from 书店 where VFP的书),“好的,稍等一下。”很快工作人员把一大堆书交到你手里。
以上可以看出,尽管目的一样,两种方式的具体实现其实截然不同(上面没有说明SQL-Select具体怎么实现,其实就是一些关系代数和集合运算,比如交、并、补、投影、笛卡尔积等等)。术语“查询”特指通过SQL-Select获取所需的数据集合;而Locate、Seek只是定位记录指针,可以视为“查找”。进一步的,Locate定位后,数据还是原封不动放在原处;而SQL-Select则取出数据形成结果集合,问题是你要把这些取出的数据怎么办?VFP中Select后,默认生成一个叫Query(中文版叫查询)的Cursor,把数据放在那里,并用一个浏览窗口展示出来给你看看。当然你应该使用SQL-Select的into或to子句指明要把取得的数据放到那里。
回复列表 (共11个回复)
沙发
wzxc [专家分:9440] 发布于 2010-01-31 09:37:00
精辟,比喻的很形象。学习了,谢谢!
板凳
cqf8340 [专家分:1810] 发布于 2010-01-31 09:47:00
向赵老师学习,收获不少,深入浅出,是初学者的良师益友。
3 楼
kosung [专家分:910] 发布于 2010-01-31 20:42:00
比喻很形象。但也对最后一段提出一些不同的看法:
我认为处理过程讲得很清楚了,但出于不同的目的会用不同的方法。
如果能快速的定位,可以进行数据的直接操作;如果只是快速拿到了一大堆书(结果),要操作怎么进行呢?争议的分歧应该是从这里产生的吧。
呀,又发了个技术含量不高的贴,还真怕会给和谐掉了。
4 楼
琅拿度 [专家分:2820] 发布于 2010-01-31 22:57:00
3楼,你这个狗屎!
人家为了大家或许有个可以借鉴的思想,辛辛苦苦发写了一篇文章。
有意见可以提出来,说些冷话干什么呢?
5 楼
homayzh [专家分:7040] 发布于 2010-02-01 22:59:00
kosung,,你在生活中也是这么不惹人爱见吗??怎么我一进贴子,总有人和你吵你啊!!
6 楼
kosung [专家分:910] 发布于 2010-02-01 23:05:00
各位别激动,“呀,又发了个技术含量不高的贴,还真怕会给和谐掉了。”
我说的是我自己的回贴,不是对各位的,造成有所误解请原谅。
因为cbl518版主说了,我发的贴没有什么技术含量,所以我的回贴就带上了这句。由于我的疏忽让各位造成误解,我我深表歉意,是我没有讲清楚,实在抱歉抱歉,还请多多原谅。
7 楼
GEORGECHIN [专家分:440] 发布于 2010-02-02 01:08:00
一碼歸一碼,針對這個用法,我覺得三樓說的並不是沒有道理.
第一,目的不同,其操作的方法也不一樣,所以肯定會用不同的命令去執行.就拿樓主的找書來說,如果那個可以給你書的人不熟習業務(網絡堵車),似乎你會等很長一段時間才會拿到你想要的書.但如果自己知道在哪地方,輕車熟路,取得這本書(定位),然后買單走人(數據處理),不會比再用SQL反寫回去來得慢吧.
第二,也許在N多的書中,你會一直要找下一本,所以就象樓主說的CONT....,可是我們不能忽視了我只要一本,你給我一堆而帶來的負擔,如果是千萬級的數據,這個是相當驚人的一個操作.(如果都不能提供完全匹配的過濾條件,LOCA和SQL是一樣,都不能一次獲得自己想要的數據).
第三:用LOCA時,表必須是打開的,其打開的工作區是可知也可設的,對原表的操作,可以節省很多步驟,比如輕鬆鎖定表頭,獨占打開等.但是用SQL,其原表會自動打開,更新時,還會按照SQL的參數去檢測更新衝突.
所以,在我看來,SQL和LOCA的區別,就象並口和串口的區別.並口一次性把數據全部發出去,如果信道好,速度足干撓低就一次搞定全部資料.但是串口一次弄一點,以极快的速度去送.我們可以評估一條馬路一臺車跑和多臺車同時跑的效率誰低誰高.其評估的條件就是:路況好不好(網絡的環境),馬力足不足(機器的性能),運送量(資料的多少).因此,我認為還是不要過於迷信SQL.
PS:前一段時間,我一開始是用循環語句的方式寫一段代碼,我覺得行數有點多,但運行起來,我還是感覺不到我在等待這個循環,然后我改成SQL,再運行時,居然可以明顯地感覺到程序在那取資料.(我在我的機器上測試過,用FOR ---ENDF插數據,大約每秒可以插入3600條記錄,我想對於絕大多數的用戶來說,一次性要更新3600條記錄,那是极少見的.我們常用的USB線,已經從1.0版升到3.0版了,但是各位如果從電子城拿的USB線哪一條能通過DDR的測試,但是哪一條又不是可以用呢?當速度是以百萬單位來計算的時候,而我們的目的就是那麼一點點的數據要操作時,我們還是要評估一下,是不是非得用火車皮來拉本來可以用自行車就可以帶走的東西)
以上淺見,如果有不妥之處,請指正.
8 楼
北京惬意 [专家分:1330] 发布于 2010-02-02 02:00:00
哎!真乃英雄所见略同啊。
9 楼
Ilikefox [专家分:5770] 发布于 2010-02-02 17:08:00
继续胡话......
“我最讨厌类了,我喜欢直接用表单设计器......”,隐约记得一位网友这样说。的确,用表单设计器很方便,从控件工具栏上选择我们想要的对象,放置到表单上,设置一下属性、添加一些事件代码,do一下form,一个简单的应用程序(包括界面和功能)几乎就都有了。哇!真是方便,和什么“类”这样的玩意儿没什么关系。这样的编程方式你很熟悉了,至少早在2.5版本的年代,就有和现在的表单设计器几乎一样的东东(屏幕生成器),直接给你个窗子,在上面随意加东西。
真是这样吗?呵呵,我上面说的真的是胡话。因为,其实,呵呵,表单设计器就是个“类”设计器,设计表单其实就是在设计一个Form类。
10 楼
Ilikefox [专家分:5770] 发布于 2010-02-02 17:24:00
你想给小朋友作一个玩具木屋。
方法(1)砍一棵树,接下来的任务无非是锯、刨、凿、钻、拼、粘、钉、磨、漆,每道工序你都要参与其中,完成具体的操作......最后做出来。这种方法下你所面对的是每道工序的具体实现过程。对任何一道工序而言,你要考虑如何完成并按照具体步骤实现;对全部工序而言,你要考虑先后的顺序,比如你不可能在没有锯开原木的情况下就考虑油漆。
方法(2)直接买一套玩具木屋拼板,组合出来。这种方法下你所面对的是一个一个现成的板块(屋顶,墙壁,大门,楼梯.....)。你不用考虑这些板块怎么由最初的木头经过怎样的加工才制成的,只管考虑怎么拼接起来。当然你可能觉得构成小木门的拼板太单调,于是给它贴一张卡通画......
方法(1)是“面向过程”;方法(2)是“面向对象”。
我来回复