28

Schemaless 是目前在 NoSql 世界中流传的一个术语。

  1. 这是什么意思 ?
  2. 我今天有一个包含 3 个属性的文档,我使用它开始生产,那么当我需要向我的文档中添加另外 2 个属性时,我的数据会发生什么?
  3. 这纯粹是一个迁移问题,我需要管理我的数据迁移,还是 NoSql 数据库可以像 RDBMS 一样产生摩擦,或者以某种方式让它变得更容易?
4

2 回答 2

27

Schema-less 有点用词不当,最好将其视为:

  • SQL = 写入时由 RDBMS 强制执行的模式
  • NoSQL = 写入时由 DBMS 强制执行的部分模式,读取时由应用程序完全强制执行的 PLUS 模式(外部化模式)

因此,虽然假设的无模式 NoSQL 数据存储在理论上允许您在不事先了解键或数据类型的情况下存储您喜欢的任何数据(通常是文档中的键值对),但除非您有一些机制来检索和使用数据。所以本质上,模式部分地从 RDBMS 移动到应用程序代码中。我说部分是因为您将向文档集合添加索引和/或对数据进行分区以提高性能,因此 NoSQL DBMS 将在本地定义部分模式,并可能通过唯一约束强制执行。

至于向商店中的文档/对象添加其他属性。根据文档周围有多少填充(未使用空间),在其物理数据块中,向文档添加更多键值对可能导致文档必须物理移动到更大的连续存储块,并重新构建相关的索引。如果您计划在经常使用的查询中使用新键,那么您还需要添加一个合适的新索引,这显然需要一些物理存储,最初构建需要一段时间,并且可能会导致您要求系统管理员为 DBMS 分配更多内存,以允许缓存新索引。

于 2013-03-23T16:58:37.860 回答
3

有点晚了,但是在再次搜索该主题时,我发现了这篇文章

http://tech.pro/tutorial/1189/basics-of-ravendb-nosql

请参阅文章中的第 3 节,为方便起见,我将再次引用它。

向 RavenDB 添加和更改数据模型再简单不过了。由于它是一个 NoSQL 数据库,它可以非常简单地处理对模型的添加和删除。如果一个属性被添加到你的类中,它将被设置为该类型的默认值。如果一个属性被删除,那么在反序列化时该值将被忽略。不再使用 SQL 脚本。

这似乎是 RavenDB 的逻辑答案。

于 2013-04-04T18:49:11.500 回答