Java 如何将公共数据从不同的模式插入临时表?
我不知道如何解决这个问题: 我们从各种在线供应商Amazon、Newegg等处导入订单信息。每个供应商都有自己的特定术语和订单结构,我们已将其镜像到数据库中。我们的数据导入到数据库中没有任何问题,但是我面临的问题是编写一个方法,从数据库中提取所需字段,而不管模式如何 例如,假设我们有以下结构: 新蛋结构: 亚马逊结构: 如何选择这些项目并将其放入临时表中供我查询 临时表可能如下所示:Java 如何将公共数据从不同的模式插入临时表?,java,postgresql,Java,Postgresql,我不知道如何解决这个问题: 我们从各种在线供应商Amazon、Newegg等处导入订单信息。每个供应商都有自己的特定术语和订单结构,我们已将其镜像到数据库中。我们的数据导入到数据库中没有任何问题,但是我面临的问题是编写一个方法,从数据库中提取所需字段,而不管模式如何 例如,假设我们有以下结构: 新蛋结构: 亚马逊结构: 如何选择这些项目并将其放入临时表中供我查询 临时表可能如下所示: "OrderNumber" character varying(25) NOT NULL, "Transacti
"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个类,加上每个新市场需要一个额外的类,但是它比当前的实现要好:哇-谢谢你花时间写出来-我非常感谢。我肯定会在几周后阅读这个答案我要确保我能消化所有的东西。再次感谢哇-谢谢你花时间写出来-我非常感谢。我肯定会把这个答案读几遍,以确保我能消化所有的答案。再次感谢