将 JSON 格式转换为 PostgreSQL 中的关系数据?

Converting JSON format to relational data in PostgreSQL?

我正在构建一个时间跟踪器应用程序,用户可以在其中记录他们每天工作了多少小时。基本上,它是一个网格,每天都有一个唯一的输入字段,如下所示:https://jsfiddle.net/L5u1fc0a/130/

所以,网格中每一行的数据结构returns数据是这样的

{
    "id": 7,
    "firstname": "Joe",
    "lastname": "Bergen",
    "email": "joe@gmail.com",
    "hour": [
      {
        "id": 4,
        "user_id": 7,
        "userinput": {
          "2018-11-10": "8",
          "2018-11-11": 10,
          "2018-11-12": "7",
          "2018-11-13": "8",
          "2018-11-14": "8",
          "2018-11-15": "10"
        }
      }
    ]
  },

这会将我的 PostgreSQL 数据库中的所有内容作为一行存储在 ID“4”下。我的问题是,有没有更好的方法来存储这些数据?我最好将它存储在关系 table 中,这样最终求和和求平均值会更容易,但我不确定如何从客户端做到这一点

关系建模就是采用现实世界中独立的意义单位或 'things' 并映射它们之间的关系。在这种情况下,您有:

  1. 一个人

  2. 一个人完成的一段作品

而这之间的关系就是一个人可以有很多工期

所以你想要两个 tables:

  1. 一个人 table 有一个人级别的所有数据列,他们的名字,姓氏,可能的职位等。为了让事情变得简单,你可以给他们一个自动- 递增主键 ID,如您在问题中所述。

  2. 工作日志 table,包含列 person_id、日期和时间。您实际上并不需要自动递增的主键,因为可以依靠 person_id 和日期的组合来唯一标识一行。

这个人 table 应该已经存在并被填充 - 埃里克是从哪里抽出来的。然后,您可以创建一个工作日志 table,其外键 person_id 引用了人 table。所以在一个典型的应用程序中它会像这样工作:

在客户端,记录了特定人员一天的工作。应用程序使用以下数据向后端服务器发送 http POST 请求:

fetch("/worklog/new", {
    headers: {
      'Accept': 'application/json',
      'Content-Type': 'application/json'
    },
    method: "POST",
    body: JSON.stringify({
      person_id: 1,
      date: '2018-11-15'
      hours: 8
   })
})

在您的后端服务器中:

app.post('/worklog/new', (req, res) => {
  const { person_id, date, hours } = req.body

  const { Pool } = require('pg');
  const pool = new Pool({
    connectionString: process.env.DATABASE_URL
  });
  pool.query(`
    INSERT INTO worklog (person_id, date, hours)
    VALUES (, , )
  `, [person_id, date, hours]).
    .then(() => {
      pool.end();
      res.send('WORKLOG ADDITION SUCCESFUL')
    })
    .catch(err => {
      pool.end();
      console.error(err)
      res.status(500).send('WORKLOG ADDITION FAILED')
    })
});

我可能漏掉了一些东西,但你可以从上面得到大致的想法。您当然需要先在数据库中创建人员 table 和工作日志 table。

另一种方法是完全不对数据进行关系建模,而是使用 MongoDB 或 DynamoDB 之类的方法按原样存储数据。您还可以研究使用像 sequelize 这样的 ORM 来使关系数据插入更容易,或者使用像 Mongoose 这样的东西来使 MongoDB 更容易。在建模、存储和检索数据方面确实有大量的选择。但是,如果您的首要任务是分析 - 求和和求平均值,那么关系存储可能是您的最佳选择。