Thứ Tư, 15 tháng 10, 2025

Dữ liệu text/log, image, video...lưu trữ như thế nào?

Ban đang băn khoăn loại dữ liệu huge clob blob, clob, json,... khác nhau chỗ nào, hãy phân tích và lấy ví dụ giúp tôi. Với các loại dữ liệu text lớn, ảnh, video, file log lớn thì tôi nên lưu dạng nào: 

- Dạng đường dẫn và file bên ngoài file system

- Dạng clob ...

Dưới đây là “bản đồ nhanh” để phân biệt CLOB/BLOB/JSON… và cách chọn mô hình lưu trữ cho text lớn, ảnh, video, log, kèm ví dụ lệnh & kết quả để anh dễ hình dung.

1) Phân biệt nhanh các loại dữ liệu

Oracle

  • CLOB/NCLOB: lưu văn bản (Unicode), phù hợp log, nội dung dài, JSON dạng text.

  • BLOB: lưu nhị phân (ảnh, video, PDF…).

  • JSON (native 21c+/23ai): kiểu JSON gốc (truy vấn/đánh chỉ mục tốt). Trước đó thường lưu JSON trong CLOB/BLOB + CHECK (col IS JSON).

  • BFILE: chỉ trỏ tới file ngoài file system (read-only).

  • SecureFile LOB (khuyến nghị): LOB hiệu năng cao, hỗ trợ nén/compress, khử trùng lặp/dedup, mã hoá, logging (tốt hơn BasicFile LOB).

  • (LONG/ LONG RAW: cũ, tránh dùng).

PostgreSQL

  • text: văn bản “gần như không giới hạn” (TOAST tự nén).

  • bytea: nhị phân (ảnh/video).

  • json / jsonb: jsonb có nén & index GIN, truy vấn nhanh.

  • Large Object (lo): API streaming bằng OID (ít dùng cho app hiện đại trừ khi cần stream từng phần lớn).

MySQL (InnoDB)

  • TEXT (TINY/MEDIUM/LONGTEXT): văn bản dài.

  • BLOB (TINY/MEDIUM/LONGBLOB): nhị phân.

  • JSON (native): có generated column để index field bên trong.

SQL Server

  • NVARCHAR(MAX): văn bản lớn.

  • VARBINARY(MAX): nhị phân.

  • FILESTREAM / FileTable: lưu file trên file system nhưng được SQL Server quản lý giao dịch (phù hợp file lớn/streaming).

  • JSON: lưu NVARCHAR(MAX) + JSON_VALUE/OPENJSON + computed column để index.

MongoDB (NoSQL)

  • Document BSON: JSON mở rộng (giới hạn ~16MB/document).

  • GridFS: lưu file >16MB theo chunk (ảnh/video lớn), metadata ở document.


2) Nên lưu thế nào cho từng loại nội dung?

Nội dungKịch bảnNên lưu trong DBNên lưu ngoài (đường dẫn / object storage)
Text lớn / LogOLTP cần tra cứu theo khóa, phân tích một số fieldCLOB/text/jsonb + cột tách field để index; partition theo ngày/thángLog khối lượng lớn → ELK/ClickHouse/OpenSearch, hoặc file + object storage (S3/MinIO) + metadata trong DB
JSONDữ liệu nửa-cấu trúc, cần query theo keyOracle JSON (hoặc CLOB+IS JSON), PG jsonb, MySQL JSON + generated columns, SQL Server NVARCHAR(MAX) + computed columnsNếu document-centric khối lượng lớn, schema linh động → MongoDB
Ảnhup to ~10–50MB/ảnh, cần ACID và phân quyền sátBLOB (Oracle SecureFile / PG bytea / SQL VARBINARY(MAX))Ảnh lớn/số lượng lớn, cần CDN/chi phí thấp → object storage (S3/MinIO), DB lưu URL + checksum + metadata
Video / File lớn (100MB – GB)Streaming, CDN, chi phíKhông khuyến khích nhét thẳng DBObject storage + CDN; SQL Server có FILESTREAM/FileTable nếu bắt buộc “thuộc DB”
File ngoàiĐọc-chỉ & nằm trên OSOracle có BFILE (read-only)

Quy tắc chọn nhanh

  • < 10–50MB/đối tượng, cần ACID/phiên bản/backup chung → lưu trong DB (BLOB/CLOB/JSON).

  • 50MB hoặc khối lượng cực lớn/streaming/CDN → lưu ngoài (S3/MinIO, NFS) + DB chỉ lưu đường dẫn/URL + metadata.

  • Log phân tích/search → hệ log/analytic (ELK/ClickHouse), không đổ hết vào CLOB trong OLTP.


3) Ví dụ & kết quả đầu ra

3.1 Oracle – JSON hybrid (raw JSON + cột tách)

-- 23ai/21c: JSON native; 19c: dùng CLOB + CHECK (doc IS JSON) CREATE TABLE ekyc_oracle ( id NUMBER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, doc JSON, -- hoặc CLOB + CHECK (doc IS JSON) name VARCHAR2(200), national_id VARCHAR2(30), id_check VARCHAR2(10), created_at TIMESTAMP DEFAULT SYSTIMESTAMP ); -- insert & populate cột tách DECLARE v_json CLOB := '{ "document":"NEW ID","name":"NGUYỄN SĨ PHƯỢNG","id":"034058007041","id_check":"REAL" }'; BEGIN INSERT INTO ekyc_oracle(doc, name, national_id, id_check) SELECT v_json, JSON_VALUE(v_json, '$.name'), JSON_VALUE(v_json, '$.id'), JSON_VALUE(v_json, '$.id_check') FROM dual; END; / -- truy vấn theo field JSON SELECT name, national_id FROM ekyc_oracle WHERE JSON_VALUE(doc,'$.id_check') = 'REAL';

Kết quả

NAME NATIONAL_ID ------------------- ------------- NGUYỄN SĨ PHƯỢNG 034058007041

Ảnh/nhị phân (BLOB) – SecureFile

CREATE TABLE media_oracle ( id NUMBER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, filename VARCHAR2(255), content BLOB, -- SecureFile nếu tablespace cấu hình mime_type VARCHAR2(64), bytes NUMBER, created_at TIMESTAMP DEFAULT SYSTIMESTAMP ); -- Upload bằng app sử dụng bind :blob_param

BFILE (file ngoài, read-only)

CREATE OR REPLACE DIRECTORY media_dir AS '/mnt/media'; CREATE TABLE media_ref ( id NUMBER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, filename VARCHAR2(255), file_ref BFILE ); -- INSERT: INSERT INTO media_ref(filename, file_ref) -- VALUES ('a.jpg', BFILENAME('MEDIA_DIR','a.jpg'));

3.2 PostgreSQL – jsonb + index GIN

CREATE TABLE ekyc_pg ( id bigserial PRIMARY KEY, doc jsonb NOT NULL, name text, national_id text, id_check text, created_at timestamptz DEFAULT now() ); INSERT INTO ekyc_pg (doc, name, national_id, id_check) VALUES ( '{"document":"NEW ID","name":"NGUYỄN SĨ PHƯỢNG","id":"034058007041","id_check":"REAL"}'::jsonb, 'NGUYỄN SĨ PHƯỢNG','034058007041','REAL' ); CREATE INDEX ON ekyc_pg USING GIN (doc); CREATE INDEX ON ekyc_pg ((doc->>'id_check')); SELECT doc->>'name' AS name, doc->>'id' AS id FROM ekyc_pg WHERE doc->>'id_check' = 'REAL';

Kết quả

name | id ---------------------+-------------- NGUYỄN SĨ PHƯỢNG | 034058007041

Ảnh/nhị phân

CREATE TABLE media_pg ( id bigserial PRIMARY KEY, filename text, content bytea, mime text, bytes int8, created_at timestamptz DEFAULT now() );

3.3 MySQL – JSON + generated columns

CREATE TABLE ekyc_mysql ( id BIGINT AUTO_INCREMENT PRIMARY KEY, doc JSON NOT NULL, name VARCHAR(200) GENERATED ALWAYS AS (JSON_UNQUOTE(JSON_EXTRACT(doc,'$.name'))) STORED, national_id VARCHAR(30) GENERATED ALWAYS AS (JSON_UNQUOTE(JSON_EXTRACT(doc,'$.id'))) STORED, id_check VARCHAR(10) GENERATED ALWAYS AS (JSON_UNQUOTE(JSON_EXTRACT(doc,'$.id_check'))) STORED, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); INSERT INTO ekyc_mysql (doc) VALUES (JSON_OBJECT('document','NEW ID','name','NGUYỄN SĨ PHƯỢNG','id','034058007041','id_check','REAL')); CREATE INDEX idx_idcheck ON ekyc_mysql(id_check); SELECT name, national_id FROM ekyc_mysql WHERE id_check='REAL';

Kết quả

name | national_id ---------------------+------------- NGUYỄN SĨ PHƯỢNG | 034058007041

Ảnh/nhị phân

CREATE TABLE media_mysql ( id BIGINT AUTO_INCREMENT PRIMARY KEY, filename VARCHAR(255), content LONGBLOB, mime VARCHAR(64), bytes BIGINT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP );

3.4 SQL Server – NVARCHAR(MAX) JSON + computed columns

CREATE TABLE dbo.ekyc_sqlserver ( id BIGINT IDENTITY PRIMARY KEY, doc NVARCHAR(MAX) NOT NULL, name AS JSON_VALUE(doc,'$.name') PERSISTED, national_id AS JSON_VALUE(doc,'$.id') PERSISTED, id_check AS JSON_VALUE(doc,'$.id_check') PERSISTED, created_at DATETIME2(3) DEFAULT SYSUTCDATETIME() ); DECLARE @j NVARCHAR(MAX)=N'{"document":"NEW ID","name":"NGUYỄN SĨ PHƯỢNG","id":"034058007041","id_check":"REAL"}'; INSERT INTO dbo.ekyc_sqlserver(doc) VALUES (@j); CREATE INDEX IX_ekyc_idcheck ON dbo.ekyc_sqlserver(id_check); SELECT name, national_id FROM dbo.ekyc_sqlserver WHERE id_check='REAL';

Kết quả

name national_id ------------------- ------------ NGUYỄN SĨ PHƯỢNG 034058007041

Ảnh/nhị phân & file lớn

-- Trong DB CREATE TABLE dbo.media_sql ( id BIGINT IDENTITY PRIMARY KEY, filename NVARCHAR(255), content VARBINARY(MAX), mime NVARCHAR(64), bytes BIGINT, created_at DATETIME2(3) DEFAULT SYSUTCDATETIME() ); -- Hoặc FILESTREAM / FileTable để lưu ngoài FS nhưng quản lý bởi SQL Server.

3.5 MongoDB – document & GridFS

db.ekyc.insertOne({ document: "NEW ID", name: "NGUYỄN SĨ PHƯỢNG", id: "034058007041", id_check: "REAL", created_at: new Date() }); db.ekyc.createIndex({ id_check: 1 }); db.ekyc.find({ id_check: "REAL" }, { _id:0, name:1, id:1 }); // => { "name":"NGUYỄN SĨ PHƯỢNG", "id":"034058007041" } // File >16MB: dùng GridFS (fs.files, fs.chunks)

4) Kết luận ngắn gọn (chọn mô hình)

  • JSON có truy vấn theo key → Oracle JSON / PG jsonb / MySQL JSON / SQL Server (NVARCHAR + computed) hoặc MongoDB nếu document-centric.

  • Ảnh/video lớn, cần streaming/CDNObject storage (S3/MinIO) + DB lưu URL + checksum + metadata.

  • File vừa/nhỏ với yêu cầu ACID & phân quyền chặt → Lưu trong DB (BLOB/CLOB).

  • Log khổng lồ → Hệ log/analytic (ELK/ClickHouse), hoặc file + object storage + metadata trong DB.

=============================
Website không chứa bất kỳ quảng cáo nào, mọi đóng góp để duy trì phát triển cho website (donation) xin vui lòng gửi về STK 90.2142.8888 - Ngân hàng Vietcombank Thăng Long - TRAN VAN BINH
=============================
Nếu bạn không muốn bị AI thay thế và tiết kiệm 3-5 NĂM trên con đường trở thành DBA chuyên nghiệp hay làm chủ Database thì hãy đăng ký ngay KHOÁ HỌC ORACLE DATABASE A-Z ENTERPRISE, được Coaching trực tiếp từ tôi với toàn bộ bí kíp thực chiến, thủ tục, quy trình của gần 20 năm kinh nghiệm (mà bạn sẽ KHÔNG THỂ tìm kiếm trên Internet/Google) từ đó giúp bạn dễ dàng quản trị mọi hệ thống Core tại Việt Nam và trên thế giới, đỗ OCP.
- CÁCH ĐĂNG KÝ: Gõ (.) hoặc để lại số điện thoại hoặc inbox https://m.me/tranvanbinh.vn hoặc Hotline/Zalo 090.29.12.888
- Chi tiết tham khảo:
https://bit.ly/oaz_w
=============================
2 khóa học online qua video giúp bạn nhanh chóng có những kiến thức nền tảng về Linux, Oracle, học mọi nơi, chỉ cần có Internet/4G:
- Oracle cơ bản: https://bit.ly/admin_1200
- Linux: https://bit.ly/linux_1200
=============================
KẾT NỐI VỚI CHUYÊN GIA TRẦN VĂN BÌNH:
📧 Mail: binhoracle@gmail.com
☎️ Mobile/Zalo: 0902912888
👨 Facebook: https://www.facebook.com/BinhOracleMaster
👨 Inbox Messenger: https://m.me/101036604657441 (profile)
👨 Fanpage: https://www.facebook.com/tranvanbinh.vn
👨 Inbox Fanpage: https://m.me/tranvanbinh.vn
👨👩 Group FB: https://www.facebook.com/groups/DBAVietNam
👨 Website: https://www.tranvanbinh.vn
👨 Blogger: https://tranvanbinhmaster.blogspot.com
🎬 Youtube: https://www.youtube.com/@binhguru
👨 Tiktok: https://www.tiktok.com/@binhguru
👨 Linkin: https://www.linkedin.com/in/binhoracle
👨 Twitter: https://twitter.com/binhguru
👨 Podcast: https://www.podbean.com/pu/pbblog-eskre-5f82d6
👨 Địa chỉ: Tòa nhà Sun Square - 21 Lê Đức Thọ - Phường Mỹ Đình 1 - Quận Nam Từ Liêm - TP.Hà Nội

=============================
cơ sở dữ liệu, cơ sở dữ liệu quốc gia, database, AI, trí tuệ nhân tạo, artificial intelligence, machine learning, deep learning, LLM, ChatGPT, DeepSeek, Grok, oracle tutorial, học oracle database, Tự học Oracle, Tài liệu Oracle 12c tiếng Việt, Hướng dẫn sử dụng Oracle Database, Oracle SQL cơ bản, Oracle SQL là gì, Khóa học Oracle Hà Nội, Học chứng chỉ Oracle ở đầu, Khóa học Oracle online,sql tutorial, khóa học pl/sql tutorial, học dba, học dba ở việt nam, khóa học dba, khóa học dba sql, tài liệu học dba oracle, Khóa học Oracle online, học oracle sql, học oracle ở đâu tphcm, học oracle bắt đầu từ đâu, học oracle ở hà nội, oracle database tutorial, oracle database 12c, oracle database là gì, oracle database 11g, oracle download, oracle database 19c/21c/23c/23ai, oracle dba tutorial, oracle tunning, sql tunning , oracle 12c, oracle multitenant, Container Databases (CDB), Pluggable Databases (PDB), oracle cloud, oracle security, oracle fga, audit_trail,oracle RAC, ASM, oracle dataguard, oracle goldengate, mview, oracle exadata, oracle oca, oracle ocp, oracle ocm , oracle weblogic, postgresql tutorial, mysql tutorial, mariadb tutorial, ms sql server tutorial, nosql, mongodb tutorial, oci, cloud, middleware tutorial, docker, k8s, micro service, hoc solaris tutorial, hoc linux tutorial, hoc aix tutorial, unix tutorial, securecrt, xshell, mobaxterm, putty

ĐỌC NHIỀU

Trần Văn Bình - Oracle Database Master