文档数据库中架构更改的模式

2023-12-22

在我开始之前我想为此道歉 我的问题的通用类型 - 我确信整本书 可以就该特定主题进行写作。

假设您有一个包含多个文档模式的大型文档数据库 以及每个模式的数百万个文档。 在应用程序的生命周期中,需要更改架构 经常查看已存储的文档(和内容)。

这样的改变可能是

  • 添加新字段
  • 重新计算字段值(将总额分为净额和增值税)
  • 删除字段
  • 将字段移动到嵌入文档中

在我的上一个项目中,我们使用了 SQL DB,我们遇到了一些非常相似的挑战 这导致了一些显着的离线时间(对于 24/7 产品) 更改变得非常剧烈,因为 SQL 数据库通常会在以下情况下对表执行锁定操作: 发生变化。我想避免这样的情况。

另一个相关的问题是如何处理架构内部的更改 使用的编程语言环境。通常模式更改发生在 更改类定义(我将使用 Mongoid OR-Mapper MongoDB 和 Ruby)。如何处理不支持的旧版本文档 更符合我最新的类定义。


这是一个非常好的问题。

MongoDB 等面向文档的数据库的优点是来自同一集合的文档不需要具有相同的字段。拥有不同的字段本身不会引发错误。这就是所谓的灵活性。出于同样的原因,这也是一个不好的部分。

因此,问题和解决方案都来自应用程序的逻辑。

假设我们有一个模型 Person 并且我们想要添加一个字段。目前在数据库中我们已经拯救了 5,000,000 人。问题是:我们如何添加该字段并减少停机时间?

可能的解决方案:

  1. 更改应用程序的逻辑,使其能够应对具有该领域的人和没有该领域的人。

  2. 编写一个任务,将该字段添加到数据库中的每个人。

  3. 使用新逻辑更新生产部署。

  4. 运行脚本。

因此,唯一的停机时间是重新部署所需的几秒钟。尽管如此,我们还是需要花时间研究逻辑。

所以基本上我们需要选择正常运行时间和我们的时间哪个更有价值。

现在假设我们要重新计算一个字段,例如增值税值。我们不能像以前那样做,因为有些产品带有增值税 A,另一些产品带有增值税 B 没有意义。

因此,一个可能的解决方案是:

  1. 更改应用程序的逻辑,使其显示增值税值正在更新,并禁用可能使用它的操作,例如购买。

  2. 编写脚本来更新所有增值税值。

  3. 使用新代码重新部署。

  4. 运行脚本。当它完成时:

  5. 使用完整的操作代码重新部署。

因此,并不是绝对的停机,只是某些特定部分的部分停机。用户可以继续查看产品的描述并使用应用程序的其他部分。

现在假设我们要删除一个字段。该过程与第一个过程几乎相同。

现在,将字段移至嵌入文档中;那是一件好事!该过程与第一个过程类似。但我们需要检查它是嵌入文档还是字段,而不是检查字段是否存在。

结论是,使用面向文档的数据库,您将拥有很大的灵活性。因此,您可以有多种优雅的选择。您是否使用它取决于您更看重您的开发时间还是客户的时间。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

文档数据库中架构更改的模式 的相关文章

  • 在哪里可以下载可用作数据仓库的示例数据库? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 在哪里可以下载可用于创建数据仓库的示例数据库 它不应该是来自 Microsoft Northwind
  • 从数据库中删除重复的行

    我需要从数据库中删除重复的行 我可以用简单的sql查询来完成吗 如果没有 请告诉我一些快速算法来做到这一点 Example id field one field two 1 0000000 11111111 2 2222222 333333
  • 数百个别名/同义词与数据库表的完全限定名称

    考虑到多个模式中的数百个数据库表 在创建存储过程和视图时 您是否建议使用别名 同义词或完全限定名称 给定一些 schema table 像这样 Orders OrderHeader Production LineThroughput Sal
  • PostgreSQL 中字符串列类型的索引数组

    是否可以在类型为的列上创建索引文本数组 尝试使用GIN索引 但查询似乎没有使用这些索引 Example CREATE TABLE users name VARCHAR 100 groups TEXT Query SELECT name FR
  • 通过 Matlab 访问 Physionet 的 ptbdb 中的数据库

    我首先设置系统 old path which rdsamp if isempty old path rmpath old path 1 end 8 end wfdb url http physionet org physiotools ma
  • 如何在 PostgreSQL 中将数据库从一台服务器移动到另一台服务器?

    我正在尝试将数据库从旧服务器移动到新服务器 任何帮助 将不胜感激 Just pipe http www postgresql org docs current interactive migration html从旧服务器转储到新服务器 p
  • Mongodb - 为现有集合添加架构

    我的 MongoDB 中有一个包含 1300 万条记录的集合 不幸的是 当我创建这个集合时 没有为其创建模式 我想知道除了备份整个数据库 创建架构并上传所有数据之外 是否有任何方法可以添加 JSON 架构 您可以使用以下方法将 JSON 架
  • 数据库分片和 Rails

    在 Rails 中处理分片数据库的最佳方法是什么 分片应该在应用层 活动记录层 数据库驱动层 代理层还是其他层处理 各自的优点和缺点是什么 FiveRuns 有一个名为的 gem数据结构 https github com bpot data
  • APEX 安装失败,PLS-00201:必须声明标识符“SYS.DBMS_DB_VERSION”

    尝试在 Oracle XE 18c 数据库上安装 Oracle APEX 20 2 如下官方说明 https docs oracle com en database oracle application express 20 1 htmig
  • 对多个数据库执行 SQL 查询

    我知道我的帖子与该论坛中的其他帖子的标题非常相似 但我真的找不到我需要的答案 这是我的问题 我的 Windows Server 上运行着 SQL Server 在我的 SQL Server 中 我有大约 30 个数据库 它们都具有相同的表和
  • .NET 的 BLOB 分布式存储?

    我正在寻找一个经过相当好的测试的库 服务器来存储持久的分布式哈希表 我对使用基于 SQL 的解决方案犹豫不决 因为数据是高度面向文档的 由数百万个约 64KB 的 blob 组成 只有一个索引 由所述 BLOB 的哈希计算 并且需要能够进行
  • 有没有多核利用NoSQL系统?

    我从昨天开始就开始使用 MongoDB 并且非常喜欢它 我正在尝试导入大量数据 20 亿行 并为其建立索引 但它似乎没有使用我的系统拥有的 8 个核心 并且导入以正常速率 60000 条记录 秒 进行 我只能想象索引这个集合中的两列可能需要
  • 串行类型的外键 - 确保始终手动填充

    我有两个表 国家和地区 CREATE TABLE Countries id SERIAL name VARCHAR 40 NOT NULL PRIMARY KEY id CREATE TABLE Regions id SERIAL coun
  • @GenerateValue(strategy = GenerationType.SEQUENCE) 和 startVaule

    当在 Hibernate 中使用 GeneeratedValue Annotation 并向数据库添加新实体时 它的 id 为 1 n 是否可以设置第一个值 以便获得 id 例如10000 n 序列样式生成器应该做到这一点 Generate
  • 实现软删除的最佳方法是什么?

    目前在做一个项目 我们要对大部分用户 用户角色 实现软删除 我们决定添加一个is deleted 0 数据库中每个表的字段并将其设置为 1 如果特定用户角色点击特定记录上的删除按钮 现在为了将来的维护 每个SELECT查询需要确保它们不包含
  • 如何使用 django ORM 在外键字段上连接两个表?

    假设我有以下模型 class Position models Model name models CharField class PositionStats models Model position models ForeignKey P
  • 删除数据库中的行后如何重新排序ID

    我正在使用 C 来制作具有 sql 数据库的程序 在数据库中我有一个名为Workers 它有一个自动增量和主键ID column 当我删除一条记录时 ID 之间会出现间隙 删除记录后如何重新排序 ID UPDATE 我要做的就是找到记录后将
  • SQL 连接两个没有关系的表

    我有具有相同结构的不同表 我想通过其中一列将它们连接起来 问题是他们不共享该专栏中的信息 Table 1 Type A Name Value Table 2 Type B Name Value 结果表 在单列中 nameFromA name
  • 无法在 Sqlite3 中添加默认值为 NULL 的 NOT NULL 列

    尝试将 NOT NULL 列添加到现有表时出现以下错误 为什么会发生这种情况 我尝试了 rake db reset 认为现有记录是问题所在 但即使重置数据库后 问题仍然存在 你能帮我解决这个问题吗 迁移文件 class AddDivisio
  • Flutter 中有预填充数据库使用的示例吗?

    Flutter 中有预填充数据库使用的示例吗 我不需要 CRUD 示例 此时我只需要从数据库读取数据即可 我是 Flutter 新手 所以一步一步的教程会很好 您可以将您的应用程序与预填充的 sqlite 数据库捆绑在一起assets文件夹

随机推荐

  • 如何显示隐藏在导航栏后面的弹出窗口

    我是 Bootstrap 和 Angular 的新手 在我的网页中有一个按钮 我为这样的跨度提供一个弹出窗口 span style padding 5px DOWNLOAD span 但它隐藏在导航栏下 根据我的谷歌搜索 我发现在 html
  • Java图像缩放japplet

    我正在尝试制作一个小程序 允许我打开 放大和缩小图像 我有一个正在运行的小程序 但在缩放方面遇到了问题 关于从这里前往哪里有什么想法吗 这就是我到目前为止所拥有的 图像缩放 import javax swing import java aw
  • Java iText 页脚

    我正在尝试使用 JSP 页面生成 PDF 我的编码大纲如下 Document document new Document PageSize A4 70 Left 70 Right 140 Top 30 Bottom response set
  • Java中如何保证文件的原子移动或异常?

    在我的一个项目中 我对一个 JRE 中的一个文件进行并发写入访问 并且希望通过首先写入临时文件 然后使用原子移动将该临时文件移动到目标来处理该问题 我不关心写入访问的顺序等 我需要保证的是在任何给定时间单个文件都是可用的 我已经知道 Fil
  • 如何将txt文件中的内容复制到剪贴板? [复制]

    这个问题在这里已经有答案了 我的桌面上有一个 txt 文件 test txt 我想打开该 txt 文件并将所有内容复制到剪贴板 我该怎么做 我想出了如何打开文件并读取行 path C Users Username Desktop test
  • Textblob - HTTPError:HTTP 错误 429:请求过多

    我有一个数据框 其中一列的每一行都有一个字符串列表 平均而言 每个列表有 150 个单词 每个单词约 6 个字符 数据帧的 700 行中的每一行都是关于一个文档 每个字符串是该文档的一个单词 所以基本上我已经将文档中的文字标记化了 我想检测
  • 使用图形密集型多点触控应用程序,XNA 还是 WPF?

    我即将开始开发多点触控应用程序 我需要在 WPF 和 XNA 之间做出选择 哪个跑得更快 WPF 已经拥有通过 TUIO 输入支持多点触控的库 有谁知道类似的库 甚至只是示例代码在 XNA 中拖动 旋转 移动对象 谢谢 西南 触摸只是获取用
  • 在 JSch 中使用 ChannelSftp 传输文件夹和子文件夹?

    我想使用 JSch 传输文件夹和子文件夹ChannelSftp 我可以使用成功传输文件channelsftp put src dest 命令但这不适用于文件夹 至少我无法使其工作 那么有人可以解释一下如何使用传输文件夹和子文件夹吗Chann
  • 如何将 Javascript 文件导入 Haml 视图?

    我想在 Haml 视图中包含一些 Javascript 功能 但我不希望将其插入到每个视图中 我是否必须将 Javascript 文件放在 public javascripts 中 还是可以将其放在 app assets javascrip
  • 使用@ViewBuilder创建支持多个子视图的视图

    SwiftUI 中的某些视图 例如 VStack 和 HStack 支持将多个视图作为子视图 如下所示 VStack Text hello Text world 据我收集 他们使用视图生成器 https developer apple co
  • 如何解决重叠轴刻度标签

    我正在研究来自 SDSS 斯隆数字巡天 的数据来绘制和分析恒星的光谱 为此 我从他们的网站下载了一个 csv 文件 从中提取每一行及其数据 然后绘制该数据 数据的格式为波长 通量 最佳拟合 SkyFlux 但我只对波长和最佳拟合真正感兴趣
  • Android模拟器太慢了,无法使用

    我对Android模拟器的体验是它太慢了以至于无法使用 我看到与该问题相关的线索可以追溯到一年多前 对问题缺乏一致的回答是不可接受的 这不是社区的错 问题 有谁经历过速度极其缓慢 启动时间超过 15 分钟 实际解决了这个问题使得启动时间不到
  • 使用 JQuery 将 拖放到段落中

    我需要拖放 span to p 我的代码可以运行 但有 3 个问题 当我编辑时 p p 通过输入内容 假设三个单词 并拖动后 span to span p p 新输入的单词充当一个单词 因此不能在这些新输入的内容之间放置可拖动组件 关闭后
  • “NODE_OPTIONS”未被识别为内部或外部命令 - 仍然是一个问题

    我正在遵循以下指南here https nextjs org docs advanced features debugging在 nextjs 应用程序上 在 Windows 上使用 VSCode 它说使用脚本 dev NODE OPTIO
  • 如何在 Windows 应用商店应用程序 C# 中读取 mp3 文件的每分钟节拍数标签?

    我正在尝试读取嵌入在 mp3 文件中的 bpm 如下所示 我尝试过使用 Windows Storage FileProperties MusicProperties 但它只包含标题 歌手等 它无法读取我之前显示的 bpm 我正在调查http
  • 仅重用 Crystal Reports 刷新时的某些参数?

    我有一个水晶报表 它有两个参数 其中之一由运行报表的 C 应用程序自动设置 但另一个由用户设置 我想这样做 以便当用户刷新报表时 仅提示用户输入的参数 我知道 ReuseParameterValuesOnRefresh 属性 但这使得所有参
  • wso2 Esb 中代理服务和 API 服务的区别

    wso2esb 中的代理服务和 API 服务有什么区别 为了公开我的服务 我可以提供代理 URL 和 API URL 那么在哪种情况下两者会有所不同 在什么情况下可以使用代理 在什么情况下可以使用API 请帮助我理解 API 具有资源 因此
  • Apache-HttpComponents:套接字关闭错误

    我正在编写一个 Java 程序 它使用 Apache HttpComponents 加载页面并将其 HTML 打印到控制台 但是 该程序在抛出此错误之前仅打印部分 HTML Exception in thread main java net
  • 使用 fs.writeFile() 在 Node.js 中创建 .wav 文件

    我正在尝试创建一个 wav从 Node JS 中的数据块中读取文件 使用fs writeFile 首先 这可能吗 我目前正在尝试这个 fs writeFile filename wav blob recording function err
  • 文档数据库中架构更改的模式

    在我开始之前我想为此道歉 我的问题的通用类型 我确信整本书 可以就该特定主题进行写作 假设您有一个包含多个文档模式的大型文档数据库 以及每个模式的数百万个文档 在应用程序的生命周期中 需要更改架构 经常查看已存储的文档 和内容 这样的改变可