XML数据应该以何种方式保存进数据库。
例子, 比如一个论坛的帖子,其XML文档结构如下:
<?xml version=”1.0” eocoding=”gb2312”?>
<帖子>
<提问帖子>
<帖子ID>000001</帖子ID>
<作者ID>某某</作者ID>
<发表时间>某某时间</发表时间>
<帖子主题>某某问题</帖子主题>
<帖子内容>某某内容</帖子内容>
</提问帖子>
<答复帖子>
<提问帖子ID>000001</提问帖子ID>
<帖子ID>0001</帖子ID>
<作者ID>某某</作者ID>
<发表时间>某某时间</发表时间>
<帖子内容>某某内容</帖子内容>
</答复帖子>
<答复帖子>
<提问帖子ID>000001</提问帖子ID>
<帖子ID>0002</帖子ID>
<作者ID>某某</作者ID>
<发表时间>某某时间</发表时间>
<帖子内容>某某内容</帖子内容>
</答复帖子>
…
</帖子>
那么,我有两种设计方案(本人认为第二种更可行)
方案一:
把整个XML文档存入一个数据表作为一条纪录。
该数据表结构:FileID(文档标识),File(文档内容),CreateDate(创建时间)
该方案优点:结构简单
缺点:不能作复杂的查询,比如要查找某个作者的所有帖子
方案二:
设计两个数据表,一个存放提问帖子,一个存放答复帖子,用一个ForeignKey联系两表,而且两个表并非用一个字段存放所有XML内容,而是把XML的每个叶子节点设计成一个字段
Topic表数据结构:TopicID(主键),UserID,CreateDate,Issue,Content
Reply表数据结构:ReplyID(主键),TopicID(外键,与Topic的TopicID形成多对一关系),UserID,CreateDate,Content
该方案优点:数据分类明确,方便作复杂查找
缺点:结构复杂
咋眼一看,我认为第二种设计方案更加合理,但我马上想到了一个问题,上述XML文件结构相对简单,容易把叶子节点设计成为二维数据表。但现实中,可能会出现更加复杂的数据结构,还可能出现属性,如下:
<a>
<b>
<c att01=”…” att02=”…”>
<d>…</d>
</c>
…
</b>
….
</a>
出现这种相对复杂,甚至可能更复杂的结构时候,似乎用第一种方案更加通用。而第二种方案基本无法实现(除非建立多个数据表,形成复杂的关联),那么要从众多数据表把数据重新导出成为XML时肯定相当复杂,。
本人刚刚入门XML,了解XML的优点,但当想想具体的XML与数据库应用时候,真的没有任何设计经验。请各位为我指点迷津。