Asked Mar 24th, 2023 1:36 p.m. 268 1 2
  • 268 1 2
0

Thắc mắc về cách UPDATE data vào db tốt

Share
  • 268 1 2

E đang làm 1 trang về blog bằng react, nodejs, sql, trong đó 1 table post sẽ liên kết với nhiều table khác mà user cũng có thể sửa thông tin khi vào trang update post (vd như table tags, ta có thể cập nhật danh sách tags mà post có ), vấn đề là e ko biết sau khi client gửi giá trị mới của post (bao gồm cả danh sách tags và các thông tin khác) về server ta nên so sánh giá trị cũ với giá trị của post mới sau đó mới cập nhật vào db ( việc so sánh này e cảm thấy rất phức tạp do ngoài giá trị của chính post còn có các giá trị từ các table khác nhau nên hiện cấu trúc của data trở thành 1 object chứa nhiều array và trong các array lại gồm các object,... ) hay xóa hết post cũ đi và tạo post mới.

2 ANSWERS


Answered Mar 25th, 2023 4:49 a.m.
Accepted
0

Thực ra có rất nhiều cách tiếp cận để giải quyết việc này hay hơn.

Nhưng mình đang hiểu case của bạn đang là như vậy:

app.put("/update-post", async (req, res) => {
  const { postId, updatedPost, newTags } = req.body;

  await updatePost(postId, updatedPost);

  const oldTags = await getTagsForPost(postId);

  const tagsToAdd = newTags.filter(tag => !oldTags.includes(tag));
  const tagsToRemove = oldTags.filter(tag => !newTags.includes(tag));

  //....

  await Promise.all([
    addTagsToPost(postId, tagsToAdd),
    removeTagsFromPost(postId, tagsToRemove),
    //....
  ]);

  res.send({});
});

Việc xử nhiều logic cùng một lúc ko phải là vấn đề. Vấn đề là mọi thứ cần clear từng bước một. Trong thực tế project mình xử lý một file markdown or csv từ phía client upload lên s3 (hoặc có thể trực tiếp từ post....) sau đó xử lý hàng trăm logic trước khi đẩy vào DB là chuyện rất bt.

That note: Nhiều logic ko có nghĩa là bạn xử lý toàn bộ data ở Nodejs. (remember: Non blocking IO)

Quan trọng vẫn phải là clear từng bước 1 khó quá thì mình tách ra từng cái nhỏ hơn. Khó hơn nữa thì tìm những design hoặc template hoặc source code có sẵn (khá nhiều trên github bạn tự research nhé) => bạn đọc trong đó xem thử người ta làm thế nào thì cover chế cháo lại.

Share
Answered Mar 24th, 2023 1:55 p.m.
0

Bạn nên tìm hiểu về REST API.

Có 2 method update là PATCHPUT

Nếu bạn dùng PATCH thì bạn chỉ việc update những thông tin có trong request vào post

Ngược lại nếu dùng PUT thì bạn override toàn bộ thông tin, nếu không có trong request thì bạn set NULL.

Tiếp theo, thong thường nếu update tags thì mình sẽ tách API ra, việc update tags của bài viết có thể thực hiện bằng path /api/posts/:id/tags/ với method PUT.

Chắc bạn đang đưa lối suy nghĩ của NoSQL vào SQL rồi, lúc update post thì chỉ cần read giá trị và đập vào thôi.

Hoặc bạn đang nghĩ phần validation, phần validation thì bên business layer hoặc validator bên controller xử lý, database chỉ nên chịu trách nhiệm nhận data và update vào thôi, trừ phi ràng buộc nào đặc biệt.

Share
Mar 24th, 2023 2:12 p.m.

không biết e có giải thích khó hiểu k, nhưng đây ko phải cái e đang hỏi @@, hiện tại e đang triển khai rest api. việc update dc request cho 1 router put. Chỉ có 1 router put vì e đang làm là user vào trang chỉnh sửa post ( trong trang này có cho phép chỉnh sửa số lượng tags, .... ) sau đó user click save. toàn bộ data sẽ đưa về router put này. Vấn đề là với 1 cục data giá trị mới này ta nên xử lý như thế nào để update do ta không biết trong cục data này giá trị nào giữ nguyên, giá trị nào đã thay đổi. vậy nên ta nên lọc những cái giá trị đã dc thay đổi này ( việc tìm dc cái nào thay đổi e đang thấy rất phức tạp ) và update nó vào sql, hay xóa toàn bộ data post cũ, và create new post luôn. ( nó đơn giản nhưng xử lý dư thừa)

Vậy nên vấn đề e là caasch xửa lý data trc khi đưa nó vào sql thay vì cho nó vào sql ntn.

Và tất nhiên data đến server e đã cho validation.

0
| Reply
Share
Avatar Kiên Đinh @kiendev
Mar 25th, 2023 4:16 a.m.

@moemoe Như mình đã nói, với router PUT thì bạn ko cần so sánh, cứ đập thẳng vào SQL là được.

Ví dụ như typeorm nếu bạn bật cascade UPDATE, thì nó sẽ update luôn nguyên object và relation nếu nó có sẵn ID.

Còn tags. nếu ORM không support, thì trước khi update bạn xóa hết relation, sau đó chạy for để add lại những tags có trong array.

0
| Reply
Share
Viblo
Let's register a Viblo Account to get more interesting posts.