Лучший способ сделать это с Node.js, Express и MySQL? - PullRequest
1 голос
/ 16 марта 2020

Так что мне было интересно, есть ли у кого-нибудь лучший метод для моей проблемы. По сути, мне нужна запись внутри записи, которую я вставляю в базу данных. Я имею в виду, что мне нужно иметь историю всех изменений, внесенных в запись при обновлении. Поэтому, когда запись обновляется, я сохраняю информацию в столбце «Обновления». Каждый раз, когда есть обновление, я выбираю обновления из этой записи, объединяю новую информацию со старыми обновлениями и вставляю ее. См. Мой код ниже.


app.post("/updateRecord", function(req,res){
  var prevResultUpdates = "";
  async function first(){
    con.query("SELECT * FROM Equipment WHERE Serial="+req.body.serial+" AND Part="+req.body.part, function(err,result,fields){
      if (err) throw err;
      console.log(result[0]['Updates'])
      return prevResultUpdates= prevResultUpdates + "," + result[0]['Updates']

    });
  }
  async function second(){
    await first();
    var customer = req.body.customer;
    var update = "\'" + prevResultUpdates + ',' + req.body.update + "," + Number(Date.now()) + "," + req.body.customer + ',' +"\'";
    var serial = req.body.serial;
    var part = req.body.part;
    var sql="Update `Equipment` SET `Customer`= '"+customer+"', `Updates`="+update+" WHERE Serial=" + serial + " AND Part=" + part;
    con.query(sql,function(err,result,fields){
      if (err) throw err;
      res.json(result)
    })
  }
  second();

  res.end()

})

Есть мысли о том, как сделать это лучше?

1 Ответ

1 голос
/ 16 марта 2020

Здесь куча предложений.

Во-первых, поместите столбец в вашу таблицу следующим образом:

last_change TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

Он всегда будет содержать время самой последней операции INSERT или UPDATE для каждая строка автоматически, без необходимости упоминать ее в вашем SQL.

Во-вторых, помните, что

UPDATE Equipment SET Updates = Updates + ' some text string' 

работает. Вы можете изменить столбец на месте, не извлекая его прежнее значение. Но это может потерпеть неудачу, когда столбец становится слишком длинным. Итак, сделайте это вместо этого.

UPDATE Equipment SET Updates = RIGHT(Updates + ' some text string', 255)

при условии, что ваш столбец Updates определен как VARCHAR(255). Я использовал RIGHT(), а не LEFT(), потому что, по-видимому, наиболее интересным является последнее обновление.

В-третьих, вам, вероятно, будет целесообразно нормализовать это, добавив таблицу Equipment_history. Вместо добавления журнала обновлений в столбец вставьте новую строку в Equipment_history. Эта таблица может иметь эти столбцы

equipment_history_id  INT          primary key
equipment_id          INT          foreign key to Equipment table
customer              VARCHAR(255) identity of the customer 
update                VARCHAR(255) reason for update
last_change           TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

Это позволяет вам при необходимости восстановить историю ваших обновлений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...