【问题标题】:Can you import differently-structured data into a PostgreSQL database?您可以将不同结构的数据导入 PostgreSQL 数据库吗?
【发布时间】:2021-02-24 13:51:39
【问题描述】:

我希望我的措辞正确。

据我了解,SQL 数据必须遵循严格的模式格式

例如

{
  "id": 123,
  "name": "Jesus",
  "middleName": "H.",
  "lastName": "Christ"
}

我导入 SQL 数据库的数据都必须遵循这种格式,对吗?要适应预定义的 SQL Schema?


我问是因为一家初创公司聘请我来修复他们的应用程序。它一直在使用GraphCool 获取数据,但该服务已关闭。

他们导出了所有数据并给了我包含所有数据的文件。

要将曾经在GraphCool中的数据迁移到Prisma 2,首先需要我将数据导入PostgreSQL。

数据位于几个非常大的文件中。而且它不遵循结构。

例如,在其中一个文件的开头,数据的结构如下:

{
  {
    "valueType": "nodes",
    "values": [
      {
        "tagName": "etc",
        "updatedAt": "etc",
        "_typeName":"etc",
        "id":"etc",
        "createdAt":"etc"
      },
      {
        "tagName": "etc",
        "updatedAt": "etc",
        "_typeName":"etc",
        "id":"etc",
        "createdAt":"etc"
      },
      { ... }

..但后来,在同一个文件中,结构变成了令人费解的混乱:

{
  "tagName":"etc",
  "updatedAt":"etc",
  "_typeName":"etc",
  "id":"etc",
  "createdAt":"etc"
},
{
  "updatedAt":"etc",
  "_typeName":"etc",
  "data": {
    "value": [
      {
        "form_1": {
          "timestamp":"etc",
          "model": {
            "type":"etc",
            "key":"etc",
            "content": {
              "text":"etc",
              "smallKey":"etc",
              "listText":"etc"
            },
...

有没有办法将大块数据(无论结构如何)导入 PostreSQL 数据库?

【问题讨论】:

  • 在考虑如何导入数据之前,您需要考虑如何使用数据。如果您要将它与特定工具一起使用,该工具需要/期望什么结构?如果您要在特定方面查询它,它们是什么?您需要能够根据这些“杂乱”数据进行查询,还是可以将其视为未处理的向用户显示的单个 blob?在一种极端情况下,您可以将整个数据作为单个文本字符串导入单个表的单个列中;但这不太可能有用。
  • 我真的不确定。对于这项任务,我对此的理解可能没有达到它需要的水平。他们的应用程序有很多用户,并且托管服务消失了,因此应用程序被破坏了。我认为这只是将他们的数据提供给新的托管服务,并将应用程序(react-native)指向新服务的问题。
  • 是的,听起来你可能超出了你的深度。您不会在 托管服务 之间移动 - 这意味着您在两个地方都使用相同的技术,而只是为服务器支付不同的公司费用;听起来正在发生的事情是您在 托管应用程序 之间移动,这些应用程序具有相同的目的,但工作方式不同。除非新服务有旧服务导出格式的导入器,兼容的 API 可用于您的应用实际处理此数据的任何操作,否则您将需要花一些时间了解数据的含义意思是。
  • 切换是从 GraphCool 到 Prisma 2。所以......不,它没有你提到的方便的东西。感谢您的评论,除非需要新的 SO 帖子,否则我将花时间处理此问题并返回此帖子进行更新或(可能提供更多帮助)。再次感谢!

标签: json reactjs database postgresql react-native


【解决方案1】:

我不会只是将每个数组元素放入 jsonb 列中,

相反,定义一个表,其中包含所有常见和重要属性的适当列,其余的为 jsonb

CREATE TABLE nodes (
   pkey bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
   updatedat timestamp with time zone NOT NULL,
   typename text NOT NULL,
   tagname text,
   createdat timestamp with time zone,
   extra_junk jsonb
);

这将允许您保留复杂的 JSON 混乱(减去常规属性,因为数据重复很糟糕),而您有常用属性的常规列,特别是那些您想在 SQL 语句中使用的属性。

如果没有一个属性对您的数据库处理很重要,您当然可以将整个数组元素放入jsonb。在此上下文中,“重要”是用于查询、约束等的属性。如果您知道 SQL 语句,您就可以弄清楚这些。尽量只对那些只是数据库“有效负载”的部分使用 JSON。

【讨论】:

  • 有趣。那么,我是否手动查看数据,列出所有最常出现的属性,为每个属性写入列,然后将其余的 jsonb 写入?似乎我最终可能不会为重要的属性创建列
  • 谢谢,很清楚。您的回答与 IMSoP 的评论一致。我现在正在解析应用程序的代码。我会用我的发现和/或如果我再次需要帮助来更新这篇文章。谢谢
  • 嘿劳伦兹。我找到了所有 SQL 语句以及相关属性。我仍然不清楚,因为有模型,但查询/突变语句(graphql)似乎不一定遵循确切的模型结构。我现在手动浏览数据文件,添加换行符和缩进,以便更好地理解数据的结构。这是个好主意还是我在浪费时间?
  • 我也不清楚我需要一个模式表还是多个
  • @Cin88 您承担的项目是部分翻译(到一个全新的数据结构)和部分重写(以便应用程序使用新的数据结构)。为了使该项目成功,您需要很好地理解数据的含义应用程序如何使用它 - 而不仅仅是“字段 A 由功能 B 使用”级别, 但“字段 A 代表现实世界中的 X,应用程序使用它来实现业务目的 Y”。如果您想让应用程序在没有它的情况下运行,您需要找到一种更接近原始技术的技术。
猜你喜欢
  • 2012-10-20
  • 1970-01-01
  • 2014-09-16
  • 1970-01-01
  • 2016-10-16
  • 2015-09-22
  • 2012-02-11
  • 1970-01-01
  • 2020-06-28
相关资源
最近更新 更多