【问题标题】:PostgreSQL view to read another table, transform data and return resultsPostgreSQL 视图读取另一个表,转换数据并返回结果
【发布时间】:2011-08-30 14:00:43
【问题描述】:

能否请一些人提出最好的实现方式:

基本上我想要的是 PostgreSQL 中的一个虚拟表,当被查询时,它会从其他表中查找数据(称之为原始数据表)。但问题是,原始数据表中的数据需要转换,转换完成后,返回的结果就像在原始表中一样。

我会用插图和一个例子来解释(不是我的真实程序,只是一个简化的例子来解释我需要的主要内容):

原始数据表

| id (int) | data (byte[]) |
----------------------------
|   ...    |      ...      |
|   ...    |      ...      |

人员表(虚拟表)

| name (varchar) | address (varchar) | phone (varchar) |
--------------------------------------------------------
|       ...      |        ...        |       ...       |
|       ...      |        ...        |       ...       |
|       ...      |        ...        |       ...       |

我现在想要的是,当我做这样的事情时:

SELECT * FROM person WHERE name = 'Kim';
  • 应查询原始表中的数据,即获取所有 byte[] 数组;
  • 反序列化数据以从原始数据中获取(姓名、地址、电话);
  • 应用任何条件,即 name = 'Kim'
  • 将这组结果返回给用户,就像他们只是简单地查询了 Person 表一样。

对于反序列化/转换等,我猜我可能需要一些编程语言功能,所以对于 Java,Pl/Java 之类的东西可能有用吗?

此外,您可以假设原始数据表不会很长,它被实现为充当固定大小的缓冲区,因此读取每个查询的所有条目并不是什么大问题。

从概念上讲,我需要的是一个触发器功能,但似乎我们不能在 READ 上设置触发器。任何有关如何解决此问题的帮助将不胜感激。

【问题讨论】:

    标签: java postgresql views pljava


    【解决方案1】:

    那个数据库设计在我看来完全崩溃了。您正试图通过误用 RDBMS 来重新实现 RDBMS。

    但如果你坚持使用这种设计,我能想到的唯一方法就是编写一个集合返回函数,以程序化的方式对原始数据进行所有处理和解包。根据二进制数据的复杂性,PL/pgSQL 可能就足够了。

    然后你会做一个SELECT * FROM retrieve_person() 来获得你想要的输出。

    【讨论】:

    • 什么是更好的设计?这个想法是原始数据表会随着事件不断更新。而不是每次发生这种情况时都填充每个单独的数据集,我想反转这个过程:即只在用户询问时获取和转换数据。所以我认为我应该将数据集实现为应用于原始数据表的视图。对于这个问题有什么更好的设计?
    • 为了使 Postgres 在存储和检索数据方面非常高效,我们做了很多工作。看来您正在尝试做同样的事情。尝试将数据存储在标准字符串中,看看速度有多快。您实际上会加快检索速度,因为您只是查询数据,而不是转换数据。
    • @Larry:为什么不像您向我们展示的那样创建人员表?如果您不能这样做,那么关系数据库似乎不是您的正确选择。您可能希望将原始数据存储为 XML,然后只使用不同的 XSLT 转换
    • @Aaron:但问题是原始数据实际上是来自提要的 xml/html 文档。因此,每次收到新提要时,我都可以转换并放入相应的数据存储中,或者我可以直接放入原始数据,并等待用户在需要时请求数据。我认为第二个会更有效率,这就是为什么我有我的设计。但鉴于这种解释,我可以使用什么更好的技术?
    • 当提要进入时,将每个 XML 文档解析为并将数据保存到您的表中。将所有转换内容保存在您的客户端应用程序中,并使用 Postgres 存储和提供转换后的数据。
    猜你喜欢
    • 2011-09-30
    • 2018-03-28
    • 2011-04-15
    • 1970-01-01
    • 2022-11-24
    • 2011-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多