Java 如何将公共数据从不同的模式插入临时表?

Java 如何将公共数据从不同的模式插入临时表?,java,postgresql,Java,Postgresql,我不知道如何解决这个问题: 我们从各种在线供应商Amazon、Newegg等处导入订单信息。每个供应商都有自己的特定术语和订单结构,我们已将其镜像到数据库中。我们的数据导入到数据库中没有任何问题,但是我面临的问题是编写一个方法,从数据库中提取所需字段,而不管模式如何 例如,假设我们有以下结构: 新蛋结构: 亚马逊结构: 如何选择这些项目并将其放入临时表中供我查询 临时表可能如下所示: "OrderNumber" character varying(25) NOT NULL, "Transacti

我不知道如何解决这个问题:

我们从各种在线供应商Amazon、Newegg等处导入订单信息。每个供应商都有自己的特定术语和订单结构,我们已将其镜像到数据库中。我们的数据导入到数据库中没有任何问题,但是我面临的问题是编写一个方法,从数据库中提取所需字段,而不管模式如何

例如,假设我们有以下结构:

新蛋结构:

亚马逊结构:

如何选择这些项目并将其放入临时表中供我查询

临时表可能如下所示:

"OrderNumber" character varying(25) NOT NULL,
"TransactionId" integer,
"PurchaseDate" timestamp with time zone
据我所知,一些数据库表示一个带有整数的订单号,而另一些数据库表示一个可变字符;为了处理这个问题,我计划将数据类型转换为字符串值

有没有人给我一个建议,让我读一下,这将帮助我解决这个问题

我不需要确切的答案,只要朝正确的方向轻推一下就行了


这些数据将由Java使用,因此,如果有任何特定的Java类会有所帮助,请随时提出建议

听起来您需要创建一个抽象类来定义与数据交互的基础,然后根据需要访问的数据库模式派生一个类。这将允许核心代码对单个对象类型进行操作,然后每个实现都可以以特定于该数据库模式的形式指定查询

比如:

public class Order
{
    private String orderNumber;
    private BigDecimal orderTotal;
    ... etc ...
}

public abstract class AbstractOrderInformation
{
  public abstract ArrayList<Order> getOrders();
  ...
}
使用Newegg类:

public class NeweggOrderInformation extends AbstractOrderInformation
{
   public ArrayList<Order> getOrders() {
      ... do the work of getting the newegg order
   }
 ...
}

然后,您可以拥有任意数量的格式,当您需要信息时,您可以迭代所有实现并从每个实现中获取顺序。

听起来您需要创建一个抽象类来定义与数据交互的基础,然后根据需要访问的数据库模式派生一个类。这将允许核心代码对单个对象类型进行操作,然后每个实现都可以以特定于该数据库模式的形式指定查询

比如:

public class Order
{
    private String orderNumber;
    private BigDecimal orderTotal;
    ... etc ...
}

public abstract class AbstractOrderInformation
{
  public abstract ArrayList<Order> getOrders();
  ...
}
使用Newegg类:

public class NeweggOrderInformation extends AbstractOrderInformation
{
   public ArrayList<Order> getOrders() {
      ... do the work of getting the newegg order
   }
 ...
}
然后,您可以拥有任意数量的格式,当您需要信息时,您可以迭代所有实现并从每个实现中获取订单。

首先,您可以创建一个来提供此功能:

创建查看订单作为 选择“1”::int作为源-或任何其他标记来标识源 ,OrderNumber::文本作为订单编号 ,发票编号为tansaction_id-无铸造。。已经是int了 ,时区“UTC”的订单日期作为购买日期-!!见说明 来自tbl_newegg 联盟所有人-不是联盟! 选择2 亚马逊诺里德 ,商户订单编号 ,购买日期 来自tbl_亚马逊; 您可以像查询任何其他表一样查询此视图:

从订单编号为123且来源为2的订单中选择*; 如果订单编号不唯一,则源是必需的。否则,您将如何保证不同来源的唯一订单号

没有时区的时间戳在全局上下文中是不明确的。这只和它的时区有关。如果混合使用timestamp和timestamtz,则需要使用at时区构造将时间戳放置在某个时区以使其工作。欲了解更多解释,请阅读

我使用UTC作为时区,您可能希望提供一个不同的时区。简单的强制转换OrderDate::timestamptz将假定您当前的时区。应用于时间戳的时区将产生时间戳。这就是为什么我没有增加另一个演员阵容

虽然可以,但我建议永远不要在PostgreSQL中使用驼峰大小写标识符。避免了许多可能的混淆。请注意,小写标识符没有我提供的现在不必要的双引号

不要使用varchar25作为订单号的类型。如果文本必须是字符串,请使用不带任意长度修饰符的文本。如果所有订单号都由数字独占组成,则整数或bigint将更快

表演 实现这一点的一种方法是将视图具体化。即,将结果写入临时表:

将临时表tmp_订单创建为 从订单中选择*; 分析tmp_订单;-临时表不是自动分析的! 更改表格tmp_订单 添加约束顺序\u pk主键顺序\u nr,来源; 你需要一个索引。在我的示例中,主键约束自动提供索引

如果表很大,在创建临时表之前,请确保有足够的临时缓冲区在RAM中处理此问题。否则它实际上会让你慢下来

设置温度缓冲区=1000MB; 必须是会话中对临时对象的第一次调用。不要在全球范围内将其设置得很高,只是为了您的会话。无论如何,临时表都会在会话结束时自动删除

要估计需要多少RAM,请创建一次表格并测量:

选择pg_size_prettypg_total_relationship_size'tmp_orders'; 更多关于对象大小的信息,请参见本节

只有当您必须在一个会话中处理多个查询时,所有开销才会产生。对于其他用例,还有其他解决方案。如果您在查询时知道源表,那么将查询定向到源表会快得多。如果您没有,我会再次质疑您订单的唯一性。事实上,如果它是唯一的,您可以删除我介绍的列源代码

仅对于一个或几个查询,使用视图而不是物化视图可能会更快

我也会考虑一个PLPGSQL函数,它查询另一个表,直到找到记录为止。考虑到开销,对于几个查询来说可能更便宜。当然,每个表都需要索引

此外,如果您为OrthyNR坚持文本或VARCHAR,请考虑它。

首先,您可以创建一个以提供该功能的:

创建查看订单作为 选择“1”::int作为源-或任何其他标记来标识源 ,OrderNumber::文本作为订单编号 ,发票编号为tansaction_id-无铸造。。已经是int了 ,时区“UTC”的订单日期作为购买日期-!!见说明 来自tbl_newegg 联盟所有人-不是联盟! 选择2 亚马逊诺里德 ,商户订单编号 ,购买日期 来自tbl_亚马逊; 您可以像查询任何其他表一样查询此视图:

从订单编号为123且来源为2的订单中选择*; 如果订单编号不唯一,则源是必需的。否则,您将如何保证不同来源的唯一订单号

没有时区的时间戳在全局上下文中是不明确的。这只和它的时区有关。如果混合使用timestamp和timestamtz,则需要使用at时区构造将时间戳放置在某个时区以使其工作。欲了解更多解释,请阅读

我使用UTC作为时区,您可能希望提供一个不同的时区。简单的强制转换OrderDate::timestamptz将假定您当前的时区。应用于时间戳的时区将产生时间戳。这就是为什么我没有增加另一个演员阵容

虽然可以,但我建议永远不要在PostgreSQL中使用驼峰大小写标识符。避免了许多可能的混淆。请注意,小写标识符没有我提供的现在不必要的双引号

不要使用varchar25作为订单号的类型。如果文本必须是字符串,请使用不带任意长度修饰符的文本。如果所有订单号都由数字独占组成,则整数或bigint将更快

表演 实现这一点的一种方法是将视图具体化。即,将结果写入临时表:

将临时表tmp_订单创建为 从订单中选择*; 分析tmp_订单;-临时表不是自动分析的! 更改表格tmp_订单 添加约束顺序\u pk主键顺序\u nr,来源; 你需要一个索引。在我的示例中,主键约束自动提供索引

如果表很大,在创建临时表之前,请确保有足够的临时缓冲区在RAM中处理此问题。否则它实际上会让你慢下来

设置温度缓冲区=1000MB; 必须是会话中对临时对象的第一次调用。不要在全球范围内将其设置得很高,只是为了您的会话。无论如何,临时表都会在会话结束时自动删除

要估计需要多少RAM,请创建一次表格并测量:

选择pg_size_prettypg_total_relationship_size'tmp_orders'; 更多关于对象大小的信息,请参见本节

只有当您必须在一个会话中处理多个查询时,所有开销才会产生。对于其他用例,还有其他解决方案。如果您在查询时知道源表,那么将查询定向到源表会快得多。如果您没有,我会再次质疑您订单的唯一性。事实上,如果它是唯一的,您可以删除我介绍的列源代码

仅对于一个或几个查询,使用视图而不是物化视图可能会更快

我也会考虑一个PLPGSQL函数,它查询另一个表,直到找到记录为止。考虑到开销,对于几个查询来说可能更便宜。当然,每个表都需要索引


此外,如果您坚持OrthyNR的文本或VARCHAR,请考虑它。

我希望避免每个市场的特定类,因为我们有13个和计数,因此是13个类,再加上每个新的市场需要的类,但是它比当前的实现更好:我希望避免为每个市场指定特定的类,因为我们有13个,并且正在计算中,因此是13个类,加上每个新市场需要一个额外的类,但是它比当前的实现要好:哇-谢谢你花时间写出来-我非常感谢。我肯定会在几周后阅读这个答案
我要确保我能消化所有的东西。再次感谢哇-谢谢你花时间写出来-我非常感谢。我肯定会把这个答案读几遍,以确保我能消化所有的答案。再次感谢