【问题标题】:Django temporary merge other DB results with ORMDjango 临时将其他数据库结果与 ORM 合并
【发布时间】:2017-12-23 04:05:55
【问题描述】:

这个问题看起来很奇怪,但是我很好奇如何解决这类问题。

问题是我有两个不同的网络平台,比如说:

带有专用 OracleSQL 数据库服务器的本地网络应用程序(基于 Java)。

带有 postgres SQL 的平台 B Django

所有系统都在本地网络中。

所以在平台 B 中,有一些 django 视图需要来自系统 A 的聚合数据,但这些数据仅在每个请求的基础上才需要。

我的意思是,系统 A 是一个只有产品定价信息的 ERP 软件,而平台 B (django) 本身有产品列表。

所以我需要在 django 中创建一个视图,列出产品,按价格排序。如何做到这一点?

我正在考虑在 django 中查询产品,将产品列表加载到 RAM 存储中,然后向平台 A 询问发送产品 id 数组列表的价格,然后在 RAM 内存中进行合并以生成按价格排序的查询集。

REDIS 对这个目的有什么好处吗?

我们可以直接访问 OracleDB,并且可以在平台 A 中开发特定的端点服务。假设是 API-JSON 端点。

为了澄清我的问题,数据流可能是:

请求:给我产品

-> PlatformB <-> getPrices() <-> PlatformA
PlatformB:Products | Prices:PlatformA
<- result <- PlatformB

问题是如何获得这个 PlatformB:Products |价格:PlatformA 在性能方面。

非常感谢您的宝贵时间,

亲切的问候!

【问题讨论】:

    标签: django database postgresql merge redis


    【解决方案1】:

    如果实际传递合并数据的端点位于 B(基于 django 的应用程序)中,您可以按照您的建议:

    1. 在 A 中创建一个 REST 端点以获取每个 ID 的产品数据,例如 http://a-host/products/[pk]/prices
    2. 当 Django 收到对产品 + 价格的请求时,它使用来自 A 的 REST 端点获取产品数据。您可以添加适当的缓存标头(在 A 中)并使用缓存(在 Django 中)来减少对 A 的请求。缓存时间取决于价格的更新频率以及价格是否针对每个用户进行个性化。

    这也要求 Django 和 A 知道相同的产品 ID。


    另外,您也可以按照自己的建议将数据加载到 Redis 中。如果您已经拥有一个可供 A 和 B 访问的 Redis,并且产品数据非常稳定,则更是如此。例如,如果产品每天加载一次,然后您可以在 Redis 中重新加载数据。

    这主要是高性能的 PK 查找。如果您需要可搜索的产品,这不是最佳选择。

    还要求 A 和 B 使用相同的产品 ID,并且产品 ID 在请求期间是已知的。


    作为第三种选择,如果您需要可搜索、可排序、可过滤的数据和高性能:

    您可以将所有内容加载到 SOLR 或 Elastic 等搜索索引中,这些索引已经完全准备好您需要交付的结构。这将允许您搜索产品名称、自动完成、分面、排序、对结果结构进行分页等。尤其是分面(即 Elastic 中的聚合)可能对您很有用。

    它还将耗时的工作转移到导入过程中,并减轻来自它的请求。在导入过程中,如果 A 和 B 使用相同的产品 ID,您可以对齐数据。


    您没有提供太多关于系统的信息来真正决定什么是适合您的环境、数据和用例的好的解决方案。

    【讨论】:

    • 非常感谢您的回复。问题是我需要平台 B (django) 上的定价信息,因为它具有将显示产品/价格的 Web 前端。 Elasticsearch 解决方案可能是一种选择..
    猜你喜欢
    • 1970-01-01
    • 2017-03-27
    • 2021-05-03
    • 1970-01-01
    • 1970-01-01
    • 2015-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多