没有模式如何存储数据?

3
我正在尝试确定在我现在开始的项目中,数据存储的正确选择。
我想要存储是powershell脚本输出结果的数据。这意味着我的应用程序管理员将能够编写powershell脚本,在多台主机上执行,并将结果发送回数据存储。然后,我想以灵活的方式查询该存储。
让我澄清一下,从powershell作业返回的数据不是一个真正的对象,而是对象属性的键/值集合。因此,没有真正的对象可序列化。
假设我通过WCF服务告诉100个主机执行两个powershell命令Get-Service和Get-Process,然后它们将把结果发布到我的数据存储。我事先不知道此数据的架构。
关键不是PowerShell或WCF,而是您如何存储在存储时未知架构的数据。之后,将根据已存储的数据通过某些GUI手动创建查询。
之后,我想能够执行类似于“获取所有运行服务X和进程Y的主机列表”的查询?
我正在研究nosql数据库作为关系型DB的替代方案,但不确定哪个最好。
感谢任何输入。 /Linus

2
这个问题涉及到PowerShell、WCF和可能的正则表达式提取能力。尽管措辞暗示了一个开放性的主观问题,但它要么是可能的,要么不可能的。它应该属于SO平台。 - P.Brian.Mackey
不是的。我只是提到PowerShell和WCF,因为这有助于理解我想做什么。更简洁地问问题的方式可能是:“您将如何存储不包含在对象中而包含在字典中的数据?之后,数据应以灵活的方式可查询和索引。” - LinusK
2个回答

1

如果将数据存储为XML到关系型数据库中对您来说没有意义(顺便问一下,为什么没有意义?),那么有几个NoSQL数据库可能是不错的选择,因为它们是无模式的。

我可以推荐您查看的数据库(基于个人经验,还有许多其他相关的数据库)是CouchDB和Riak。两者都提供了一个磁盘绑定的键值数据存储,您可以将值存储为JSON,而不需要预定义模式。在这两种情况下,都可以使用Javascript通过RESTful接口查询数据。

选择应该取决于您期望的数据量:

  • Riak被设计为在多个节点上运行,查询通过MapReduce处理,使得处理分布在这些节点之间,从而实现了对于即席查询的相对快速数据检索。如果你有大量数据 - 数百万条记录需要运行即席查询,请选择它。不过你将会“付出”管理集群的额外复杂性,尽管我可以证明Riak使其相对轻松。
  • CouchDB被设计为在单个节点上运行。复制是可能的(而且很容易),但查询只能在单个服务器上运行。它具有物化指数,因此针对现有指数的查询运行速度很快。然而,即席查询需要完整的“表扫描”,在大型数据集上可能需要几分钟。另一方面,它具有一个漂亮的基于浏览器的用户界面,在免费版本中Riak缺少这个功能。

我建议先尝试使用Couch - 它非常容易设置和开始使用 - 看看它是否解决了你的问题。如果没有,那么就选择Riak。


0
如果您想在设计时存储不知道结构的数据,有几个选项可供选择。
其中的选项包括:
将数据存储为 XML(在数据库或文件中)。
动态创建模式以匹配动态数据的结构。
创建通用结构模式,其中所有类映射到同一张表,所有属性都是动态附加属性。
例如(通用类结构)。
GenericClass
{
    GenericProperty[] SimpleProperties;
    Dictionary[string, GenericClass] ComplexProperties;
}

GenericProperty
{
    String Name;
}

StringProperty: GenericProperty
{
    String Value;
}

IntegerProperty: GenericProperty
{
    Integer Value;
}

在这些类上使用表格继承应该会给你通用的表格。


对我来说,这些选项都不太合理。抱歉。 - LinusK
第三个选项(带有示例的选项)通常被使用。这不是最理想的技术,因为理想情况下,您应该事先知道结构是什么。基本上,由于您事先不知道类的元数据是什么,因此您也必须将其存储在数据库中。 - Danny Varod

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接