Spiga

关于网站应用中XML的使用心得[原创]

2007-10-06 11:32 by Brush, 4578 visits, 收藏, 编辑

   最近忙于做一个小网站,是电子商务性质的。其中很多地方我用到了XML文件作为数据存储的方式,目的就是减轻数据库负担。
  经过一两个月,在XML数据操作这块也有了一定经验,现在把它写出来共享给大家,同时也欢迎大家参与讨论。

(注:本文虽然质量不高,但转载望注明一下出处,谢谢合作!)


1。如果数据库表的记录是分组的,总的操作频繁但每组的并不频繁,且数据对保密性要求不高。那可以用XML。 

   如论坛的回帖,因为如果用数据库,好多回帖都添加到一张表里,数据库并发的可能性就大了,但换成XML,每个帖子专门建立一个文件夹,回帖里的内容均用XML文件来保存,这样的话,并发性就得到了很好的控制。


2。数据库量大的,如果用XML保存,在存取上会比较慢。所以如果能分成若干个XML文件保存就比较好。 
    
  如回帖,每50个回帖建立一个新的XML文件,而且名字跟页数对应,这样也能简化翻页。更大地减少了并发操作。


3。能用XSD描述数据结构的,就尽量描述。(开始是写的XSLT,后来更正)

  这样对查询数据(当使用DataSet查询时)时,尤其是在数据量大的时候,能获得相当大的速度提升(它跳过了DataSet的自动分析XML结构的步骤)。


4。查询XML数据,尽量使用XML空间下提供的类。

  这样能对XML进行快速地高效率地读写操作。 (稍后我会把自己写的XML操作类帖出来,供大家参考


5。使用XML时,要注意结点的值。

  有的值是需要过滤掉的,因为查询XML数据要用到XPath,其语法中的关键字是不能出现在查询关键字里的。


6。能用结点,就不要使用属性。尽量构架规范的XML结构。 

  比如说相册:
    <root >
       <相册 >
          <名称/ >
          <创建时间 / >
          <相片 >
              <图 >
                 <图名/ >
                 <地址/ >
                 <上传时间/ >
              </图 >
          </相片 >
       </相册 >
    </root >

  在这个结构中,每个图要这样放在相片结点下,而不要直接放在root结点下。这样有助于XSD(原为XSLT,后更正)结构的清晰。程序读取数据也方便。
  另,如果属性使用太多,对XPath查询会有影响,一些查询就可能不容易实现。


  其实使用XML作为数据存储方式还有好多优点,比如RSS订阅,客户端解析成HTML页面等。

  以上仅是个人的一点经验之谈,不足不馁不对之处,望各高手不吝赐教。





  后来加的:

   这里我看重的是数据的分别保存分别处理的思想。利用XML文件的分开存放使无相关的数据不再像数据库的表那样会互相影响。

   大家以考虑下,如果回帖用表来保存,这样,不管你回复哪个帖子,都要在这张表中插入一条新记录,此时的并发显然是比较高。高的原因是,不相关的回帖,即回复不同的帖子,在这种情况下也相互影响、限制了。

   如果回帖换成使用XML保存,每个帖子的回复只使用一个XML(当然为了分页方便,可以每N个回复建立一个文件,这样也省了分页查询了)。此时的并发,就被分解了。分解到回复一个帖子的情况。并且,在写XML文件时候,加上写保护,独占此资源,写完释放(而读取回帖不受影响)。这样,除非瞬间有许多人在回复同一帖子,才会形成比较大的并发操作(此时还能产生这样的并发量的网站实在是够大的了)。

   网站中的个人消息,操作记录等,我觉得,均比较适合用XML作数据源。而且是很理想的。




下面是我在项目中自己写的XML操作类。


XML操作类
Add your comment

24 条回复

  1. #1楼 wingoo      2007-10-06 11:40
    可以试下这个 http://vtd-xml.sourceforge.net/
     回复 引用 查看   
  2. #2楼 Hunts.C      2007-10-06 11:42
    关注
     回复 引用 查看   
  3. #3楼[楼主] Brush      2007-10-06 11:43
    @wingoo
    我这就去看看。。。
     回复 引用 查看   
  4. #4楼 逆耳[未注册用户]2007-10-06 11:47
    很好啊
     回复 引用   
  5. #5楼 DeViL→Ivy      2007-10-06 11:51
    总结的不错
     回复 引用 查看   
  6. #6楼 xiao_p      2007-10-06 14:03
    如果简单不如直接用xmldatasource 方便多了,甚至 如果享用linq的话,直接用linq to xml,都好用的多。

    很久以前 就尝试过用xml作为数据源,一个是并发问题,一个是多表关联问题,很难解决。 所以xml其实不适合用来做数据源,轻量级的玩玩还可以!
     回复 引用 查看   
  7. #7楼 银河      2007-10-06 14:22
    不错。
    关注。
     回复 引用 查看   
  8. #8楼 古天[未注册用户]2007-10-06 18:46
    学习下!哈哈
     回复 引用   
  9. #9楼 Matrix      2007-10-07 02:34
    多人一起回帖的话要同时操作一个xml这样是怎么控制的呀???
    请教。。
     回复 引用 查看   
  10. #10楼 光之追随者      2007-10-07 10:23
    我也发布有一篇<<基于XML文件集群的数据库>>。希望和作者一起探讨经验心得。

    请删除10楼的垃圾留言。

     回复 引用 查看   
  11. #11楼 光之追随[未注册用户]2007-10-07 11:07
    请删除10楼的垃圾留言。
     回复 引用   
  12. #12楼 JoeLee[未注册用户]2007-10-07 13:55
    1.并不觉得数据库的并发比文件系统的慢,而且按照你的设计思路.在文件很多的时候.某一个XML文件不小新坏掉了.你根本无从下手.并且文件系统的权限控制是很困难的.
    2.存储策略可以有很多种方式.分多个文件存储,不是减少了并发.是增加了并发.而且多个文件的记录有关联的时候.你还是要把这些文件加载.然后合并到一个线性表中做排序,查找.结果会更慢.
    3.用XLST跳过DataSet偶就搞不明白了.这两个东西好像没有特别大的关系.偶只知道用XLST来描述界面的话.绑定这种东西就丢给客户端去做了.服务器当然快了.
    4.查询XML.用XPath就OK了.当然是MS提供的.难道你还自己写不成?至于做复杂的查询.就要自己维护线性表来查找或者构造树之类的来查找了.
    5.结合我的2和4就知道喽.
    6.不同意你的说法呢.Attribute和ChildNode是两个东西.一个描述Attach Information,一个描述Child Member.把一个人的属性描述成这个人的儿子.你觉得看起来爽些么?

    总结:
    1.个人觉得XML针对数据库的最大的优势就是树型数据结构.当我想做树型的东西的时候.用XML非常合适.
    2.XML可以用来作为数据交换的工具.例如从c#服务端到javascript.
    3.记得学数据库的时候.讲了为什么由文件系统发展到数据库系统吧.建议你回去看看.
     回复 引用   
  13. #13楼[楼主] Brush      2007-10-07 22:46
    --引用--------------------------------------------------
    xiao_p: 如果简单不如直接用xmldatasource 方便多了,甚至 如果享用linq的话,直接用linq to xml,都好用的多。

    很久以前 就尝试过用xml作为数据源,一个是并发问题,一个是多表关联问题,很难解决。 所以xml其实不适合用来做数据源,轻量级的玩玩还可以!
    --------------------------------------------------------

    我推荐使用XML作数据的就是单一的表,一般不需要与其它XML数据相关联,否则就不如使用数据库了,因为后者要严密地多。
     回复 引用 查看   
  14. #14楼[楼主] Brush      2007-10-07 22:48
    --引用--------------------------------------------------
    Matrix: 多人一起回帖的话要同时操作一个xml这样是怎么控制的呀???
    请教。。
    --------------------------------------------------------

    这个操作文件时只能独占这个文件的资源了。具体并发时会不会冲突,我还没测试。
     回复 引用 查看   
  15. #15楼[楼主] Brush      2007-10-08 00:19
    @JoeLee
    刚才打字打了半天,忽然所有记录都没了,郁闷。。。。。再打一次吧。这回内容貌似就少了点了。

    1。数据库不比XML数据慢是对,不过要看怎么个比法。简单结构的数据,一个表和多个文件比较,哪个速度快?就拿回帖来说,在数据库中,所有的回帖全部在一张表中,试想,数据库中整个论坛中回帖的并发可能性应该比每个帖子专门有一个记录回帖的XML文件要大得多。而且,是随着帖子的增加而递增的。

    2。XML比较适合保存关联性不强的数据,比如说回帖,它除了跟帖子有关联,其它的基本上就没有关联(要显示的回复者信息直接作为复本)。这样,不会加大多少开发,但会减少很多并发。

    3。这个是我写错了。应该是XSD。先读入构架信息,然后再读取XML数据。这样优化速度。

    4。我说尽量使用XML空间下的类,是说少使用DataSet的集成的统一的查询操作,后者往往效率没有手动方法高。

    5。这个跟SQL注入有点相似,只不过后果貌似没SQL那么严重而已。这里只是过滤那些可能被作为查询条件的结点的值,添加结点的方法会自动转换对标签有影响的字符。

    6。关于属性和结点,属性完全可以写成结点的形式,而不会影响操作。关键的是,结点有助于查询。我忘了哪位高手在哪里分析过它们的利弊了,望有对此有过研究的朋友讨论下。
     回复 引用 查看   
  16. #16楼 xiao_p      2007-10-08 09:10
    在说几句
    1 在客户端用xslt 将xml 转成 html,看起来服务器是减轻了不少工作量,而且也将显示和数据分离了开来, 但是会很占用客户端的资源,原来的csdn不就是这样吗?
    2 属性和子节点其实 完全是两码子事,如果说xml是描述一棵树,那么属性是描述当前节点的行为,而子节点则低了一个层次。
    3 操作xml的时候最好使用xmlreader,不要使用xmldocument,尤其对于比较大的xml文档,虽然xmldocument是方便了不少。
    4 用xml其实 还是代替补了数据库的,只能作为数据库的有效补充,如果全部用xml存储数据的话,开始的时候还可以,到了后期,东西多了,很多数据结构就该让你闹心了。
     回复 引用 查看   
  17. #17楼 JoeLee[未注册用户]2007-10-08 09:36
    --引用--------------------------------------------------
    Brush: --引用--------------------------------------------------
    Matrix: 多人一起回帖的话要同时操作一个xml这样是怎么控制的呀???
    请教。。
    --------------------------------------------------------

    这个操作文件时只能独占这个文件的资源了。具体并发时会不会冲突,我还没测试。
    --------------------------------------------------------
    这个不是简单的独占就搞得定的.你要通过线程队列之类的东西来处理.因为用户A在写.用户B要写或读.就会抛出文件被占用异常的.只有将A及B的操作放入可等待的队列.等待A写完后再进行读写.

    至于楼主后来加的内容.把表进行横向分区就可以解决.而且表的并发是要看数据库的事务隔离级别的.因为表的并发是要根据锁的情况来进行的.不同的事务隔离级别.有不同的加锁方式.而文件系统么.偶就不清楚了.

    XSD是用来验证XML的呢.和速度好像还是没关系.用DTD一样可以解决.只是DTD少了数据类型等详细的内容.而且MS自己提出的XSD.自己也比较喜欢用这个东西而已.

    不同的团队有不同的做法,也许你们的更倾向于XML之类的吧.呵呵
     回复 引用   
  18. #18楼 ttyp      2007-10-08 13:26
    XML作为微小型数据库还行,比如做做留言板。XML最大的问题就是查询,XPATH可以做简单查询,多表交叉的查询简直是恶梦。它不像数据库,没有索引,很难优化。至于是接点还是属性的问题,真是各有各的用处,该用谁用谁。是实体则用接点,其他用属性。比如一辆红色的车子,你非搞两接点,car,color我看不一定好。在car接点里搞个color属性不好么?
     回复 引用 查看   
  19. #19楼 roydu/LeadNT/小宇哥哥[未注册用户]2007-10-09 20:21
    在数据量特别大时,XML会比数据库系统快.
     回复 引用   
  20. #20楼 i'm yzx110[未注册用户]2007-10-10 10:04
    也谈关于网站应用中XML的使用心得
    http://hi.baidu.com/yzx110/blog/item/f3464d4a7066122008f7ef4e.html
     回复 引用   
  21. #21楼 lonelyghost[未注册用户]2007-10-10 12:24
    已转载
     回复 引用   
  22. #22楼 baronbig@163.com[未注册用户]2008-03-20 19:07
    @JoeLee 说的有一定的道理。

    我在XML应用上没有多少经验,所以我只是说一下自己对XML的理解。

    在系统框架设计上,XML更多的应作为分布式系统或异构型系统集合交换数据
    的工具,更专业的讲应该是充分发挥XML在跨应用和服务器的数据交换优势,
    降低网络的overhead。

    在数据存储方面,XML作为存储数据的文件,可以做为数据库设计的一个辅助
    方式,是程序设计更为简单灵活。
     回复 引用   
  23. #23楼 快乐八哥      2011-05-25 17:23
    微软本身自己的Web开发,一般使用XML。用InfoPath生成XML。使用XSLT去做转换。
     回复 引用 查看