问题标签 [schemaless]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
890 浏览

.net - 无模式数据缓存:NoSQL 还是其他替代方案?

我正在评估一些 NoSQL 实现(目前是 RavenDB 和 MongoDB),作为解决一组特定要求的方法,这些要求涉及无模式数据的存储/检索。我想就 NoSQL 是否是我应该研究的方向,或者是否还有其他(可能更简单)选项获得一些反馈。

本质上,我们有一个软件产品(除其他外)定义了一个基本领域模型,该模型由几个相关实体组成,每个实体都有许多属性(键/值)。当我们发布给客户时,我们与他们一起设置属性和值,这本质上是系统的配置。这相当简单,并且因为设计是预先知道的,所以我们不需要任何动态来实现这一点并使其执行(我们将使用 RDBMS)。属性不是预先知道的,但这又不是问题,因为系统的这一部分几乎围绕属性模型展开。

问题是,对于不同的客户,在我们发布并投入生产之后,我们发现我们需要查询我们在编译和发布代码时(以及在我们配置属性之前)一无所知的特定属性数据集客户)。我们基本上需要从我们可以存储的属性映射中生成数据(我们不会预先知道结构),然后以我们无法预料的方式查询存储的数据。现在的想法是,我们可以创建在处理过程中受到影响的钩子,并允许我们插入库(可能通过 MEF)创建数据以便存储它,然后在需要时查询它(不是为了报告——通常用于创建额外的数据/属性)。

(请注意,创建挂钩和插件库是一个单独的问题,并不打算成为这个问题的一部分。)

一个常见的场景可能是:“我想知道过去 10 天内 xxx 发生了多少次”。所以我会创建一个插件来识别 xxx 已经发生,并将其写入带有日期/时间的数据存储。然后我会创建另一个插件(可能在同一个 DLL 中)来执行查询,并向模型添加一个名为“CountOfxxxInLast10Days”的属性。另一种情况可能是创建可配置的查找。因此,我可能有一个在启动时运行的插件,以创建/更新可以将一个属性值转换为另一个属性值的查找数据表,或者(更有可能)将转换为查找值的一系列值。因此转换插件可能会添加一个包含列的表:bottom_value、top_value、multiplier,并且查询插件将使用属性值查询该表,例如“

在某些情况下,可以在指定时间段后清除旧数据。在上述第一个场景中,可能需要从存储/缓存中删除十天之前的数据。

在其他情况下,数据需要永久保存,就像上面的第二种情况一样。有可能这些数据可以在启动时简单地重新创建,而不是保存在永久存储中。

其他要求:

  • 数据存储/缓存可以在线备份和恢复
  • 在崩溃的情况下可以从上次备份中替换/恢复
  • 数据在机器重启等事件中幸存下来
  • 经过验证/生产测试的技术

在这一点上,我们非常致力于 .Net 平台,因此任何选项都必须具有可靠的 .Net 客户端/API。

0 投票
6 回答
18248 浏览

database - 无模式数据库系统的吸引力是什么?

我已经听到很多关于无模式(通常是分布式)数据库系统的讨论,比如 MongoDB、CouchDB、SimpleDB 等......

虽然我可以理解它们对于某些目的可能很有价值,但在我的大多数应用程序中,我都试图保留具有特定类型的特定数量字段的对象,并且我只是自动在关系模型中思考。我一直在考虑具有唯一整数 id 的行、null/not null 字段、SQL 数据类型以及用于查找集合的选择查询。

虽然我被这些新系统的分布式特性和简单的 JSON/RESTful 接口所吸引,但我不明白松散类型的键/值哈希对我的开发有何帮助。为什么松散类型、无模式的系统有利于保持干净的数据集?例如,当它们可能没有日期时,我怎样才能找到日期在 x 和 y 之间的所有项目?有加入的概念吗?

我知道许多系统都有自己的差异和优势,但我想知道范式的差异。我想这是一个开放式的问题,但也许社区的答案和他们个人看到这些系统优势的方式将有助于启发我和其他人什么时候想要使用这些(诚然更时髦的)系统而不是传统的关系型数据库。

0 投票
2 回答
1207 浏览

mysql - 自定义字段的数组、EAV、序列化 LOB?

我一直在尝试为在线应用程序的自定义字段回答一个复杂的 Mysql 数据结构问题。我对 Mysql 还很陌生,所以任何输入都会受到赞赏。

当前数据库是关系数据库,服务的每个用户将共享相同的数据库和表。

这是我正在尝试做的一个例子。

假设我正在尝试创建一个列表。此列表最多可包含 30 个自定义字段。用户可以在 12 个唯一元素之间进行选择,每个元素最多可以有 15 个用户定义的属性。

每个列表在帐户内以及帐户之间都可以是唯一的。帐户可以有许多列表,每个列表可以有不同数量的元素以及每个元素的不同属性。

一个元素可以是很多东西,例如:多项选择、单选按钮、电话字段、地址、单行文本、多行文本等。

多选(复选框)元素的属性示例可以是:红色、绿色、蓝色、橙色、白色、黑色

单行文本元素的示例可能是: 名字输入字段。

每个元素还必须有一个用户定义的标题字段和标签字段,可以在应用程序的其他功能中引用和使用。

细分也很重要。用户需要能够根据任何元素对列表进行分段。例如,用户可能希望根据多项选择元素#1 中存在“红色”的所有记录来对列表“ABC”进行分段(他们可能有超过 1 个用于列表的多项选择元素)。

在此示例中,我假设数组、EAV、序列化 LOB 可以正常工作。但是,我不确定在我的规模上什么是最适合我需求的结构。

实际上,每个列表很可能有多达 50,000 条记录,并且确实有可能有 20,000 多个帐户 - 每个帐户都有许多列表。因此,我正在寻找最有效和最灵活的结构。

为了使事情变得更加复杂,我还需要确保在任何给定时间向任何特定列表添加/删除元素的有效方法。例如,如果用户创建了一个包含最大允许数量的自定义字段 (30) 的列表,然后三个月后决定他们要删除一个字段,我需要一种方法来查找该列表以及该自定义字段的所有关联值,并且然后删除所有值、元素类型及其属性。然后将允许用户向该列表添加新元素。

我已经查看了该站点上的许多 EAV 帖子,以及这个http://www.martinfowler.com/eaaCatalog/serializedLOB.html由于数据,EAV 似乎对我的需求不是很有效检索的缺点。

我还想知道多维数组在这种规模下的工作情况如何?我相信 wordpress 将其用于他们的自定义字段。

对于如何最好地为这种情况构建数据库的任何输入将不胜感激。谢谢!

0 投票
5 回答
8437 浏览

nosql - 将关系数据库用于无模式数据 - 最佳实践

在阅读了 Bret Taylor(FriendFeed 的联合创始人;Facebook 的现任 CTO)写的一篇令人震惊的文章后,FriendFeed 如何使用 MySQL 存储无模式数据,我开始怀疑是否有使用 Oracle 等 RDBMS 的最佳实践, MySQL 还是 PostgreSQL 用于存储和查询无模式数据?

当 NoSQL 成为新热点时,很少有人愿意承认他们正在使用关系数据库,这使得很难找到关于该主题的好文章。如何将无模式(或“面向文档”)数据库实现为关系数据库之上的一层?

0 投票
5 回答
8236 浏览

database - 将文件系统(不是数据库!)用于无模式数据 - 最佳实践

在阅读了我的另一个问题后,使用关系数据库处理无模式数据,我开始怀疑文件系统是否比关系数据库更适合存储和查询无模式数据。

与其仅仅在 MySQL 之上构建文件系统,为什么不直接将数据保存到文件系统中呢?需要弄清楚索引,但现代文件系统非常稳定,具有复制、快照和备份设施等强大功能,并且可以灵活地存储无模式数据。

但是,我找不到任何人使用文件系统而不是数据库的示例。

我在哪里可以找到更多关于如何将无模式(或“面向文档”)数据库实现为文件系统之上的层的资源?有人使用现代文件系统作为无模式数据库吗?

0 投票
4 回答
9063 浏览

mysql - 在无模式数据库中使用协议缓冲区进行序列化

我们正在使用 MySQL 来存储无模式数据(请参阅:使用关系数据库获取无模式数据以了解 FriendFeed 如何使用 MySQL 存储无模式数据的解决方案)。

一张大表包含我们应用程序的所有实体:

一些细节:

  • 存储实体唯一需要的属性是id16 字节的 UUID。实体的其余部分对数据库是不透明的。我们可以简单地通过将新属性存储在body.

  • added_id列存在是因为 InnoDB 按主键顺序物理存储数据行。AUTO_INCREMENT 主键确保新实体在旧实体之后按顺序写入磁盘,这有助于读/写局部性(新实体的读取频率高于旧实体)。

  • 我们的数据库将无模式数据存储在body. <- 这是这个问题的主题。

  • 许多其他有趣的细节,比如“进入”body数据以构建异步物化视图(索引只是离线构建的表),但它们与当前的讨论无关......

我们应该如何序列化中的结构化数据(键值对)body

JSON 或 BSON 会很简单,因为每行都重复字段名称。这使它在灵活性方面具有优势,但在空间效率方面也有很大的劣势(序列化数据中字段名称的每行开销)。我们试图将内容保存在内存中,并且最小化内存和网络占用空间在这里很重要。我们可以在同一空间中容纳的记录越多,我们的查询就会越快。我们更喜欢相对较长的描述性字段名称,并且缩短它们以使我的数据库更快是错误的!

最后,JSON/BSON 对于我们的目的是行不通的,除非我们变得更复杂,并将小键映射到与数据库对话的应用程序驱动程序中更具描述性的键。这让我们想到...

虽然我们的数据库是无模式的,但实际上:1)没有太多不同种类的实体,2)同种实体的版本不会经常变化,3)当它们发生变化时,通常只是添加另一个领域。JSON/BSON 没有对版本控制的原生支持。

在版本控制和数据定义更改方面,Protocol Buffers 和 Thrift 更加复杂。Thrift 和 Protocol Buffers 都非常适合将数据序列化到数据库中,并且 Thrift 的设计使得编码格式具有可扩展性。

Protocol Buffers 看起来是在无模式数据库中序列化数据的绝佳选择。

CouchDB 和 MongoDB(两个最流行的无模式数据库?)分别使用 JSON 和 BSON,但我们找不到任何关于使用更高级的东西(如 Protocol Buffers)作为存储无模式数据的序列化格式。有些产品可以存储特定语言版本的对象(即,将 Java 的 Externalizable 对象存储在数据网格中,或者在 Ruby 中使用 MySQL 执行 NoSQL),但这些产品很痛苦(尝试从其他平台访问它们,甚至从 MySQL 本身,并忘记版本控制)。

是否有人在他们的数据库中存储了更具互操作性的协议缓冲区,或者在他们的无模式数据库中存储了一些其他高级序列化格式?这是一个问题,除了直接对 JSON/BSON/XML 进行逐行序列化或序列化特定语言的对象之外,是否还有其他选项。它甚至可行吗?我们错过了什么吗?对不起意识流风格的叙述!

0 投票
1 回答
71 浏览

c# - 存储字符串中指定类型的属性

有一个 XML 方案是这样说的:

我想将此信息存储在类中,并且我希望其字段为指定类型。我想到了一个通用的方法

但是这种方法的问题是我需要一个 ExtraFields 列表,并且它们中的每一个都可以在列表中具有不同的类型。

到目前为止,我只能想到两个选择:

1)为此字段使用动态关键字,但这种方法似乎有限制

2) 使用字段的对象类型并将其动态类型转换为必要的类型。但无论如何,如果我需要一些特定于对象的调用,我将不得不进行静态转换。

我很高兴阅读您的想法/建议

0 投票
12 回答
165645 浏览

mongodb - 如何在 MongoDB 中将集合导出到 CSV?

如何将 MongoDB 集合中的所有记录导出到.csv文件中?

这要求我指定需要导出的字段的名称。我可以只导出所有字段而不指定字段名称吗?

0 投票
2 回答
1166 浏览

c# - 使用 MongoDb 和 C# 将模式依赖类转换为无模式文档

让我们假设我们有一个文档来存储我们的客户端,它具有固定和额外的字段。所以这里是我们的客户端示例类:

在额外的字段类中,我们有这样的东西:

如果我使用标准驱动程序的行为进行序列化,我会得到这样的结果:

虽然我想要这样的东西:

这将提高搜索性能,通常是文档方向的重点。

如何将序列化自定义为这种方式?

0 投票
2 回答
743 浏览

java - 如何使用 ad hoc Web 服务(非 SOAP、无模式 XML)?

我需要编写与多个外部 Web 服务的集成。其中一些是 SOAP(具有 WSDL),其中一些几乎是临时的 - HTTP(s),通过基本身份验证或 URL 中的参数(!)进行身份验证,像 XML 这样的自然语言,它并不能很好地映射到域类..

目前,我已经使用 Spring Web 3.0 完成了峰值集成RestTemplate并使用 JAXB2 ( Jaxb2Marshaller) 进行了绑定。需要某种绑定,因为域类需要比 XML 更干净。

它有效,但感觉有点糟糕。显然,这部分只是因为服务是如何构建的。我遇到的一个小问题是将RestTemplate服务命名为与 REST 无关。这是我可以忍受的。不过 JAXB2 感觉有点重。

所以,我正在寻找其他一些替代方案。想法?我想要一个简单的解决方案(所以 RestTemplate 很好),不要太企业化..