我会在这里冒险并猜测您不会找到涵盖整个问题的资源,因为问题的绝对大小将是数千页。
因此,这里有一些快速建议可以帮助您入门:
数据建模:
- 数据模型资源书,卷。1
- 数据模型资源书,卷。3
- 数据与现实
前两本书的大部分内容都在描述一些常见的建模要求,并逐步构建更高级的模型版本。最终结果不是用于快速开发的嵌入式模型,而是深入了解当复杂性上升时需要做出哪些工程权衡。一个好的经验法则——支持广泛场景的通用和灵活的数据模型往往更复杂且难以查询。只有当它们为企业提供有形价值时,它们才应该被追求。否则它们就会变得人为的复杂性。最后一本书更老,更富有哲理。它描述了应用程序中的常见建模问题,并帮助您以不同的方式思考它们。
跨多个服务器传播数据:
这些问题有一些非常新颖的解决方案,比如“Datomic”之类的东西浮现在脑海,但假设你想继续使用 MySQL/PostgresSQL 等常用的东西,我会较少关注“拆分”数据存储,而更多地关注规范化数据以减少不必要的冗余。最终,表分区可用于帮助归档和减轻针对大表的麻烦查询。另外,如果您不将资产(图像等)存储在数据库中,那么数据库有多大可能会变得那么大?许多现代数据库都在磁盘上压缩了数据,因此一个 500 GB 的数据库通常可以存储 1-2TB 的客户信息。
SQL 和关系理论 - CJ Date,关于一般关系理论的优秀书籍。
Cron Jobs:我会求助于您选择的数据库/操作系统的文档,PostgreSQL、MySQL、SQL Server、Oracle 等都有多年的批量或按需运行作业的历史。很有可能您将需要 3 大类例程:
- 定期运行的备份例程。
- 每小时/每晚/每周运行的索引例程(取决于活动)。
- 一致性检查以确保您没有发生数据损坏。
您还可能需要诸如 ETL 工具或脚本解决方案之类的东西。我会建议首先使用通用语言(Python、Ruby 等),然后根据需求选择特定部分并对其进行专门化。一个很好的例子是 ETL 例程,起初针对您的 API 运行直接命令可能工作正常,但最终规模可能决定直接 SQL 解决方案。
至于使用模式,我想说您希望拥有幂等的工作,这样您就可以始终运行它们而不必担心后果。这比听起来要困难得多,但通常会带来更好的设计。事实上,我认为即使是你的数据模型也应该尽量做到无损。依靠插入和视图来实现更改,而不是删除/更新。一旦你的架构依赖于更新(或删除),这通常是一个好兆头,如果出现任何问题,你正在做的事情可能会给你带来严重的麻烦。
缓存:这在很大程度上取决于您的应用程序需要什么。我建议研究诸如“Memcached”、“索引视图”、“更改数据捕获”之类的技术,或“apache samza”之类的项目。经常请求但很少更改的信息通常是最容易缓存的。有时,您可以对数据进行建模,以便在缓存中包含较旧的信息,然后从实时数据存储中添加最新信息。这样,您就不会专注于不断地从操作数据库中提取大量信息,而只是关注缓存中不存在的最新信息。
- Martin Kleppmann 的 Designing Data-Intensive Applications 似乎很好地涵盖了其中一些主题。虽然还没有完整的书。
存储/访问数以百万计的图像:我倾向于将它们存储在数据库中,而是将它们放在文件系统上。命名可能必须是唯一的密钥,可以安全地与文件夹中的其他文件组合,而不必担心冲突。Guids/Unique Identifiers 可能需要调查。操作系统限制在这里可能也很重要,一些系统对可以存储在单个目录中的文件有非常明确的限制。请注意,由于数据库现在有效地存储了指向文件的指针,因此您必须将针对这些文件的操作视为与数据库一起发生的事务。将它们直接存储在数据库中是可能的,但会使您的数据库管理更加困难。这是权衡,您是更愿意管理操作系统还是复杂的数据库。
其他实用建议:专注于使您的架构和数据模型尽可能简单。很容易让自己陷入极其复杂的数据模型和架构中,结果却发现运行最慢的元素与最终的设计几乎没有关系。更简单架构的另一个优点是更容易立即适应您的头脑。扩展/扩展架构从来都不是一件容易的事,但是扩展一个直接的设计(即使这意味着巨大的变化)肯定会比扩展一个非常复杂的设计更容易。