【问题标题】:How to store data when there is no schema?没有架构时如何存储数据?
【发布时间】:2011-04-20 12:54:13
【问题描述】:

我正在尝试找出在我现在开始的项目中数据存储的正确选择。

我想存储作为 powershell 脚本输出结果的数据。这意味着我的应用程序的管理员将能够编写一个 powershell 脚本,该脚本将在多个主机上执行,他们会将结果发布回数据存储。然后我想以灵活的方式查询该商店。

让我澄清一下。从 powershell 作业返回的数据不是正确的对象,而是对象属性的键/值集合。所以没有真正的对象可以序列化。

假设我通过 WCF 服务告诉 100 台主机执行两个 powershell 命令 Get-Service 和 Get-Process,然后它们会将结果回发到我的数据存储中。我事先不知道这些数据的架构。

重点不是 PowerShell 也不是 WCF,而是如何存储在存储架构时未知的数据。之后将根据已存储的数据通过一些 GUI 手动创建查询。

之后我希望能够执行一个查询,例如“获取所有运行服务 X 和进程 Y 的主机的列表”?

我正在研究 nosql 数据库作为关系数据库的替代品,但不确定什么是最好的。

感谢您的任何意见。 /莱纳斯

【问题讨论】:

  • 这个问题特定于 power-shell、WCF 和可能的正则表达式提取的功能。尽管措辞暗示了一个开放式的主观问题,但这是可能的,也可能不是。它属于 SO。
  • 不,不是。我刚刚提到了 PowerShell 和 WCF,因为它有助于理解我想要做什么。一种更简洁的提问方式可能是“您将如何存储不包含在对象中但包含在字典中的数据。数据应该可以在之后以灵活的方式进行查询和索引”。

标签: database database-design architecture


【解决方案1】:

如果将数据作为 XML 存储到 RDBMS 对您来说没有意义(顺便说一句,为什么不呢?),那么有几个 NoSQL DB 可能是不错的选择,因为它们是无模式的。

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

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

  • Riak 设计为在多个节点上运行,并且通过 MapReduce 处理查询,以便在这些节点之间分配处理,从而为即席查询实现相对快速的数据检索。如果您有大量数据 - 您必须运行即席查询的数百万条记录,请选择此选项。尽管我可以证明 Riak 让管理集群变得相对轻松,但您会为管理集群增加的复杂性“付出代价”。
  • CouchDB 设计为在单个节点上运行。复制是可能的(而且很容易),但查询针对单个服务器运行。它具有物化索引,因此对现有索引的查询运行速度很快。 Ad-hoc 查询需要完整的“表扫描”,并且在大型数据集上可能需要几分钟。 OTOH,它的好处是基于浏览器的用户界面不错,而 Riak 在免费版本中缺乏这种界面。

我建议您先试用 Couch - 它很容易设置并开始使用 - 看看它是否能解决您的问题。如果没有,那就去 Riak。

【讨论】:

    【解决方案2】:

    如果您想在设计时存储您不知道其结构的数据,您有几个选择。

    选项包括:

    将数据存储为 xml(在数据库或文件中)。

    动态创建架构以匹配动态数据的结构。

    创建一个通用的结构化架构,其中所有类都映射到同一个表,并且所有属性都是动态附加的属性。

    例如(通用类结构)

    GenericClass
    {
        GenericProperty[] SimpleProperties;
        Dictionary[string, GenericClass] ComplexProperties;
    }
    
    GenericProperty
    {
        String Name;
    }
    
    StringProperty: GenericProperty
    {
        String Value;
    }
    
    IntegerProperty: GenericProperty
    {
        Integer Value;
    }
    

    在这些类上使用 table-per-type 应该会为您提供通用表。

    【讨论】:

    • 这些选项对我来说没有任何意义。对不起。
    • 第三个选项(带有示例的那个)是常用的。这是最理想的技术,因为理想情况下,您会提前知道结构是什么。基本上,由于您事先不知道类的元数据是什么,因此您也必须将其存储在数据库中。
    猜你喜欢
    • 2011-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-09
    • 2021-08-17
    • 2015-05-03
    • 2017-09-10
    • 1970-01-01
    相关资源
    最近更新 更多