设计解决方案的指南 - XML文件与数据库

时间:2010-07-27 21:09:39

标签: linq dataset linq-to-xml xquery

我正在考虑将大量数据存储在XML文件中。每个文件都有关于不同元素的信息,比如说联系人。现在我尝试根据一些信息检索联系人,例如:找到所有居住在CA的联系人。我如何搜索此信息?我可以使用像LINQ这样的东西。我看到XElement但它适用于多个XML文件。

转换为数据集有帮助吗?所以我想我的应用程序应该有一个构造函数,它将所有xml文件加载到数据集中并对数据集执行查询。如果这是一个好方法,有人可以指向我的示例/资源吗?

最重要的是这是一个很好的解决方案还是我应该使用数据库?我使用XML文件的原因是我需要扩展此解决方案,以便将来在后端层(业务逻辑,数据库)中使用xquery,我认为在xml文件中使用数据会很有帮助。

更新我已在此处拥有架构 - http://ideone.com/ZRPco

6 个答案:

答案 0 :(得分:3)

如果将数据放在数据库中,则可以很容易地将其输出为XML。不要因为你需要在那里结束而开始使用XML。如果您需要对数据进行查询,那么数据库几乎肯定是最佳选择。

答案 1 :(得分:1)

以下是不使用XML的两个原因......

  1. 如果数据集很大,我就不会使用xml。你要么使用dom解析器(大数据速度慢)或sax解析器(速度更快,但在读取整个文件之前你会失去验证能力)。

  2. 如果数据会发生变化。您必须重写整个xml文件才能更改它的一部分。

  3. 这就是我使用XML的原因.. 如果数据集很小,则自然是分层的,并且需要在文本编辑器中可见/可编辑。

    如果需要输出为xml,从数据库输出xml不是问题。

答案 2 :(得分:1)

您可以在您的事业中使用XML。只是为了理解你的例子。

贵公司可能有1000名员工。 每个员工都可以拥有零个或多个联系人(如主要,第二个等)。 所以每个雇员都可以拥有一个contacts.xml(基于Xml数据库识别,如eXist,MarkLogic,Berkely等)。

例如-contacts.xml

数据进入Xml数据库后。然后,数据库可以根据您想要的方面获取所有排序细节。

比如通过ZipCode,按城市,按名称等获取联系人。

您需要编写特定的XQuery来挖掘数据以满足您的请求。 (对于MarkLogic Xml数据库服务器)。这个世界中使用的术语是分面浏览。

Xml数据库旨在处理此类信息。将联系人视为海量数据而不是行/列。

答案 3 :(得分:1)

这里有很多评论,没有人对MarkLogic Server XML数据库有太多了解,以及当应用多种类型的索引时,XML作为存储格式的强大功能(元素,值,属性,xml结构,xml节点顺序,单词) ,短语索引)

MarkLogic可以存储/索引数十亿个XML文档,并允许对所有这些文档进行亚秒搜索,复杂的SUM COUNT MIN MAX操作等。

我已经使用C#.NET LINQ-to-XML的关系XML文件来实现原始海报想要实现的目标。 (此时没有MarkLogic,只是简单的XML文件和C#LINQ代码将它们连接在一起以实现我正在寻找的任何类型的搜索)您可能有一个联系人的XML文件:

<contacts>
  <contact id="1" companyid="1">
    <name></name>
    <address></address>
    <city></city>
    <state></state>
  </contact>
</contacts>

您可能还希望将其加入公司的另一个XML文件:

<companies>
  <company id="1">
    <name></name>
    <address></address>
    <city></city>
    <state></state>
  <company>
</companies>

以下是一些示例C#.NET LINQ-to-XML语法,用于实现这两个文件之间的LEFT OUTER JOIN:

using System.Xml.Linq.XDocument 

XDocument xDocContacts = XDocument.Load("contacts.xml");
XDocument xDocCompanies = XDocument.Load("companies.xml");

var results = from ct in xDocContacts.Root.Element("contacts").Elements("contact")
              join cp in xDocCompanies.Root.Element("companies").Elements("company")
              on ct.Attribute("companyid").Value.ToString() equals cp.Attribute("id").Value.ToString()
              into joined
              select joined.DefaultIfEmpty();
foreach (var item in joinedResults)
{
}

我使用了90MB的XML文件和4-5MB的较小XML文件,并且可以在2-3秒的范围内执行多个WHERE条件的复杂搜索。

答案 4 :(得分:0)

听起来好像数据库是正确的解决方案。我在这里看到的两个要求是您需要针对数据集运行某些类型的查询,并且您需要在某个时刻使用XML。 SQL数据库将能够比XML文件更好地处理复杂查询,同时您可以在需要时始终将数据转换为XML。

答案 5 :(得分:0)

根据我的经验,使用XML作为主数据源不是一个好主意,在某些时候会很痛苦。请尝试使用SQLite,它是一个功能强大且可移植的关系数据库。