upsert-database

Vào vấn đề ngay và luôn cho nóng nhé:

Mình đang được giao nhiệm vụ connect tới API, lấy dữ liệu và ghi vào trong Database của mình. Nghe thì cũng không có gì đặc biệt, đọc rồi ghi vào thôi, có gì đâu. Ơ nhưng mà API lấy dữ liệu này nó không simple như mình nghĩ, nó có tình trạng data được update liên tục. Ví dụ có một bản ghi thông tin về sản phẩm có giá đang là 100k, mình đã insert thông tin đấy vào DB. Tuy nhiên 5 phút sau, mình lại nhận được một bản ghi cũng là thông tin sản phẩm đó nhưng giá sản phẩm lúc này 90k. Ơ thế cứ đẩy vào thì dư thừa quá nhỉ, mình cũng chỉ có nhu cầu giữ lại thông tin mới nhất.

Thế phải làm sao?

Ờ thì cứ mỗi lần lấy dữ liệu từ API, ông query cho tôi phát xem trong DB thì ID đó đã tồn tại hay chưa, có rồi thì ông viết câu lệnh UPDATE, chưa có thì ông viết câu lệnh INSERT vào !!!

Nghe thì có vẻ bùi tai nhưng thấy nó cứ nông dân làm sao ấy tự nhiên lại phải làm 2 bước. 1 là Select ID xem đã có chưa, xong rồi lại thêm câu lệnh INSERT or UPDATE. Chưa kể là dữ liệu ngày càng nhiều lên, thao tác như vậy thì cực quá.

Thế là anh nông dân vác cọc đi tìm trâu, xem con trâu nào cày giúp mình thửa này không. Không phụ sự thất vọng, có con trâu giải quyết được yêu cầu của mình và keyword đó chính là UPSERT Database.

UPSERT là gì?

Nó chính sự kết hợp giữa update và insert, tức là khi sử dụng câu query dạng này thì Database sẽ update nếu bản ghi đã tồn tại hoặc là insert mới nếu nó chưa tồn tại. Tất cả chỉ trong một câu query thui. Ý nghĩa thì là vậy tuy nhiên mỗi Database lại có cách thể hiện khác nhau, cùng ngó nghê qua xem nhé:

1. CockroachDB

Ông này có sẵn luôn command UPSERT cho bà con dùng, bao uy tín:

UPSERT INTO employees (id, name, email) VALUES (2, ‘Huy’, ‘tronghuy2807@gmail.com’);

2. MySQL

Ông này thì không dùng command UPSERT, thay vào đó sẽ là INSERT … ON DUPLICATE KEY UPDATE.

Ví dụ:

INSERT INTO employees (id, name, email) VALUES (2, ‘Huy’, ‘tronghuy2807@gmail.com’) ON DUPLICATE KEY UPDATE;

3. PostgreSQL

Ông này cũng tương tự ông MySQL, không dùng Command UPSERT, nhưng lại phức tạp hơn tẹo là phải định nghĩa khả năng conflict ở đâu và action sẽ là gì: INSERT ON CONFLICT. Ví dụ:

INSERT INTO employees (id, name, email) VALUES (2, ‘Huy’, ‘tronghuy2807@gmail.com’) ON CONFLICT (id) DO UPDATE;

Đó, thế là anh nông dân đã giải quyết được yêu cầu, nhìn gọn gàng hơn rất nhiều. Tuy nhiên bạn lưu ý khi đọc kỹ hướng dẫn sử dụng trước khi dùng, theo SGK thì việc UPSERT sẽ cho Performance tốt hơn khi làm việc với NoSQL. Nói chung thì cũng tuỳ loại DB và tuỳ cấu trúc dữ liệu mà bạn đang thiết kế nó có thể ảnh hưởng ít nhiều đến Performance. Ở đây mình chỉ đang chia sẻ với nhau một keyword, nếu ai chưa biết thì có thể sử dụng nó để tìm hiểu sâu hơn. Nếu bạn nào có những keyword hoặc kỹ thuật nào hay thì cùng chia sẻ nhé, hoặc có gì cần lưu ý với việc UPSERT này thì có thể chia sẻ thêm với anh nông dân và các bạn để mọi người cùng biết nhé.

Thanks, mình là Huy Đê Tê!

Kết nối với mình tại:
1. Facebook: Trọng Huy DEC
2. Đọc thêm những bài viết khác tại đây: https://www.faang.vn/

Related Post

Leave a Reply

Your email address will not be published. Required fields are marked *