随笔 - 51  文章 - 0 评论 - 210 trackbacks - 6
<2008年3月>
2425262728291
2345678
9101112131415
16171819202122
23242526272829
303112345

严正声明 : 本站文章转载请注明出处.

与我联系

搜索

 

留言簿(11)

我的标签

随笔分类

随笔档案

Atlas相关

积分与排名

  • 积分 - 58801
  • 排名 - 800

阅读排行榜

无论是论坛还是社区,经常会有这样的问题, 即在显示文章列表的时候同时显示这个发帖人的名字. 一般可以用联表查询的方式来获取,  因为在文章表里面通常只存一下用户的ID,但是老是经常这样联总是觉得不爽, 而且在网站用户规模扩大的时候你甚至需要将用户分别存入多个表 ,这个时候就比较麻烦了.  如果我们只取文章表的内容,需要人的名字的时候通过其它的手段获取会怎么样呢?

    首先当然想到的是缓存, 如果全部只是人的名字的话占用的空间应该不大, 就使用 id/名字 这样的结构来存储. 这样就至少有两个选择, HashTable, Dictionary<KT,VT>,这两个数据结构都可以达到我们的要求(这里ID显然是不重复的). 那么这样做性能如何呢, 可以写一个小小的测试. 下面是测试代码:

using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;
using System.Collections.Generic;

namespace HashTableTest
{
    
public class Program
    
{
        
static void Main(string[] args)
        
{
            Hashtable ht 
= new Hashtable();
            
for (int i = 0; i < 1000000; i++)
            
{
                ht.Add(i, i.ToString());
            }


            DateTime start 
= DateTime.Now;
            
for (int k = 0; k < 1000000; k++)
            
{
                
string str = (string)ht[k];
            }


            TimeSpan time1 
= (TimeSpan)(DateTime.Now - start);
            Console.WriteLine(
"HashTable花费时间 : " + time1 .TotalSeconds.ToString() + "");


            Dictionary
<longstring> dic = new Dictionary<longstring>();

            
for (long ii = 0; ii < 1000000; ii++)
            
{
                dic.Add(ii, ii.ToString());
            }


            DateTime start2 
= DateTime.Now;

            
for (long kk = 0; kk < 1000000; kk++)
            
{
                
string str2 = dic[kk];
            }


            TimeSpan time2 
= (TimeSpan)(DateTime.Now - start2);
            Console.WriteLine(
"Dictionary<>花费时间 : " + time2.TotalSeconds.ToString() + "");

            Console.ReadLine();
        }

    }

}


在沙加的神舟电脑上测试结果  HashTable的时间是 0.140,  泛型字典的时间 : 0.0625, 可以看出泛型还是占有绝对优势的.  速度也非常快. 如果用户还不多的话完全可以一次性加载所有的数据. 这样少一次联表查询很多时候就会很方便了.

Tag标签: 联表查询
posted on 2008-03-26 18:26 沙加 阅读(428) 评论(8)  编辑 收藏 网摘 所属分类: .Net开发技巧系列

FeedBack:
#1楼  2008-03-27 11:20 yellowyu      
哈哈,你的CPU是2330,一G内存的吗?我的HP测出来的跟你几乎一样呀!

但当我把数量级再加个0时,10000000机子就几乎撑受不了了,内存一直堆加上来,太恐怖了,谢谢你的提醒,我一直以为,HASH查找是最快的,而这里面的数据测出来的这点问题,等晚上再好好想想,我觉得可能是查询算法的问题,嘿嘿,请多指教
  回复  引用  查看    
#2楼 [楼主] 2008-03-27 16:17 沙加      
@yellowyu
我是奔腾双核T2060, 没有你的好~~
  回复  引用  查看    
#3楼  2008-03-28 08:23 Jam.Fu      
我收藏的文章都是转的别人写的~~~~觉得有点用就留着了~~~
以前也不知道hashtable的性能,最近看了两个测试的,hashtable是加载时比ArrayList慢,读起来比它快,但是随即看到这篇。推起来这种存法更快~~
  回复  引用  查看    
#4楼  2008-04-29 22:29 ColdDog      
"无论是论坛还是社区,经常会有这样的问题, 即在显示文章列表的时候同时显示这个发帖人的名字. 一般可以用联表查询的方式来获取, 因为在文章表里面通常只存一下用户的ID"
问沙加一个问题,我是从一篇谈三层架构的文章回复找到这里。。。
先看以上这句话,如果是联表查询,就是说查出来至少有这些字段:(Title)(文章标题),AuthorName(作者),……那这些字段信息怎么传到表现层?事先构造好的VO?如果是VO,那这个VO是不是至少有Title、AuthorName等?
但是文章表对应的实体类可能只有Title,AuthorID等,作者表对应的实体类有AuthorID,AuthorName等,那前面说的那个VO如何存在?是另外独立构建还是其他方式?
请详解,谢谢。
  回复  引用  查看    
#5楼 [楼主] 2008-04-30 17:29 沙加      
@ColdDog
这是个很好的问题,我目前采用的是 .net 2.0 下面的partial class的方式, 使用自动代码生成数据库实体, 然后再手动添加一部分的字段, 比如这里的AuthorName. 这样就比较灵活一些, 既不需要作映射也可以保证使用代码生成时的方便性.

其它的办法:可以用继承的方式添加额外的附加字段, 还可以使用NH那种本身属性即是一个对象的类型的作法也是可行的.
  回复  引用  查看    
#6楼  2008-05-01 14:26 ColdDog      
@沙加
嗯,我明白你的意思了~
这点做法也是我平时项目中的做法,我自己写的代码生成工具也考虑自动能够生成你提到的“手动添加一部分的字段”,比如我之前说的AuthorName等。
另外,我还有一个想法,我们是不是可以构造这样一个视图(数据库中的视图):包含我们所须的字段(上例中的Title、AuthorName等),然后也让代码生成工具生成视图对应的实体类。不知道这样的做法是否值得提倡。
  回复  引用  查看    
#7楼 [楼主] 2008-05-02 11:13 沙加      
@ColdDog
对这样的视图生成实体在某些情况下还有有它的特定作用的,可以考虑使用,比如对安全有比较严的限制的. 还可以利用索引视图的功能提高效率,简化程序员的工作.
  回复  引用  查看    
#8楼  2008-05-16 14:48 零缺陷生活      
@沙加
我也在比较复杂的查询时使用过视图并创建了实体,感觉还是不错的.

比较简单的就不用了吧,否则实体会很多.所以,我在想,是不是我们的实体生成,部分可以根据表生成,部分根据视图生成.

另外想问下:按照上面的说法,我们增加了AuthorName属性,那么给这个属性赋值的查询该怎么处理,是否要单独查询?

  回复  引用  查看    

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
Google站内搜索


China-pub 计算机图书网上专卖店!6.5万品种 2-8折!
近千种 9-95 新二手计算图书火热销售中!

相关文章:


相关搜索:
联表查询

相关链接: