[Công nghệ Thông tin] -- [Web] -- [Công nghệ phần mềm] -- [PhoThong] -- [Đăng ký các khóa học] -- [Langbiang's Portfolio] -- [Học viên cũ] -- [10.000 giờ]
--------------- <> -----------------
---  KHOA HỌC - CÔNG NGHỆ - GIÁO DỤC - VIỆC LÀM --->>>  CÁC KHÓA HỌC...
---  Nhận làm website, web app, chạy quảng cáo, digital marketing --->>>  LIÊN HỆ...

Tìm kiếm trong Blog

Học IT với AI (1) - Học

1. Học

1.1 Học để làm gì?

Theo UNESCO và chatbot (chatbot là một sản phẩm của AI, chatbot lâu lâu hay phát biểu liều, vì vậy hãy cảnh giác) thì:

- [1] Học để biết (Learning to know): mục tiêu đầu tiên là tiếp thu kiến thức, mở rộng hiểu biết về thế giới, xã hội, và con người. Học để biết không chỉ là tích lũy thông tin mà còn là phát triển khả năng tự học, tư duy phản biện, và chọn lọc thông tin phù hợp để không bị lạc hậu trong thời đại tri thức phong phú.

- [2] Học để làm (Learning to do): học tập nhằm trang bị kỹ năng để áp dụng kiến thức vào thực tiễn, tạo ra giá trị vật chất và tinh thần. Điều này nhấn mạnh việc kết hợp lý thuyết với thực hành, giúp con người sáng tạo, giải quyết vấn đề, và đáp ứng yêu cầu của công việc trong xã hội hiện đại.

- [3] Học để chung sống (Learning to live together): học để phát triển kỹ năng giao tiếp, đồng cảm, và hòa nhập với cộng đồng. Mục tiêu này hướng đến việc xây dựng sự hiểu biết lẫn nhau, tôn trọng sự khác biệt, và hợp tác trong bối cảnh toàn cầu hóa, nhằm thúc đẩy hòa bình và phát triển bền vững.

- [4] Học để hoàn thiện bản thân (Learning to be): học để phát triển nhân cách, khẳng định giá trị cá nhân, và đạt được sự tự do nội tâm. Điều này bao gồm việc trau dồi đạo đức, sáng tạo, và khả năng tự chủ, giúp con người sống có ý nghĩa và đóng góp cho xã hội.

Nếu bạn thấy 4 mục đích học ở trên có vẻ nhiều quá, thì có thể tập trung vào một số ý đơn giản sau:

- Học để biết cách học (có năng lực và phương pháp để học và tự học)

- Học để hiểu, để làm được việc (một lĩnh vực cụ thể trong cuộc sống)

- Học để hiểu mình và hiểu người

1.2 Học cách học

“Học hành”, nghĩa là “học đi đôi với hành”.


Luôn đặt câu hỏi: What, Why, How

Đọc thêm: https://legiacong.blogspot.com/2022/10/cach-hoc-1-hoc-va-hanh.html

Tháp học tập

- Mỗi phương pháp học có cái hay cái dở khác nhau. Ví dụ, nghe giảng (lecture) nhanh quên, nhưng sẽ có được “bức tranh lớn” của chủ đề học, có được các từ khóa quan trọng, có kết nối với chuyên gia, bạn học, đỡ phải đọc tài liệu nhiều. Chỉ bài cho người khác (Teaching Others) học được nhiều, nhưng phải biết mới chỉ được, và không phải lúc nào cũng có người sẵn sàng ngồi làm “học trò”.

- Nên kết hợp nhiều phương pháp học, tùy thuộc vào điều kiện, hoàn cảnh, tình huống.

Đọc thêm: https://legiacong.blogspot.com/2022/10/cach-hoc-3-thap-hoc-tap.html

1.3 Học để hiểu, để làm được việc

Thang đo Bloom:

– Đọc/nghe/xem thật nhiều để có thông tin, từ đó suy nghĩ, chắt lọc, hệ thống hóa, xâu chuỗi để hiểu vấn đề

– Thực hành thật nhiều để củng cố lý thuyết, có kỹ năng làm việc, có thể tạo ra sản phẩm

– Không ngừng đặt ra các câu hỏi tại sao, rồi tìm ra câu trả lời cho chúng

– Ghi chép một cách có hệ thống các kiến thức đã học được

Đọc thêm: 

https://legiacong.blogspot.com/2022/10/cach-hoc-2-thang-do-bloom.html

Chu trình học tập Kolb:

– Do đặc điểm tâm lý khác nhau, nên khi học, mỗi bạn sẽ có xu hướng lựa chọn các giai đoạn khác nhau để bắt đầu. 

– Bạn thường có xu hướng chỉ tập trung vào một giai đoạn mà bạn ưa thích và thành thạo. 

– Người lớn tuổi thường có xu hướng đi từ “lý thuyết” > “chiêm nghiệm”  > “thực hành”; trong khi trẻ em, người trẻ có xu hướng đi từ “thực hành” > “chiêm nghiệm” > “lý thuyết”.

– Học liệu của một môn học thường gồm: tài liệu lý thuyết, video hướng dẫn làm theo, video bài giảng, câu hỏi thảo luận, bài thực hành, bài tập nâng cao, dự án thực tế

– Để học hiệu quả, bạn cần có giáo viên đồng hành, họ sẽ là người thiết kế chương trình, hỗ trợ quá trình học; ngoài ra, họ còn đóng vai trò như một người huấn luyện viên, đưa ra lộ trình học, thực hiện các bài đánh giá, gây áp lực.

– Người giáo viên sẽ đánh giá bạn ở cả bốn mức độ: nhớ, hiểu, tổng hợp, áp dụng vào thực tế. Mục đích là để bạn trải qua đầy đủ bốn giai đoạn học. Công cụ đánh giá thường gồm: các câu hỏi (trắc nghiệm) để kiểm tra khả năng nhớ, hiểu và tổng hợp; kiểm tra, báo cáo, đánh giá dựa trên dự án, bài tập lớn, và các sản phẩm do bạn thực hiện.

Đọc thêm: https://legiacong.blogspot.com/2022/10/cach-hoc-4-chu-trinh-hoc-tap-kolb.html

Mô hình Dreyfus

Sau đây là lộ trình học, các bạn có thể tham khảo, nó được sắp xếp từ dễ đến khó. Để học nhanh và hiệu quả, bạn nên kết hợp nhiều cách làm cùng lúc.

– Xem các clip hoặc đọc hướng dẫn chi tiết và làm theo

– Đọc sách giấy hoặc ebook tiếng Việt, làm theo và tạo ra sản phẩm

– Đọc sách giấy hoặc ebook tiếng Anh, làm theo và tạo ra sản phẩm

– Sử dụng chatbot (ví dụ: chatgpt, copilot, gemini, grok, cursor) để hỗ trợ bạn trong quá trình học và làm việc. 

– Làm một bài tập lớn hoàn chỉnh, làm theo tài liệu hướng dẫn hoặc clip

– Tải mã nguồn các dự án từ trên mạng (ví dụ github), đọc hiểu và làm lại. Mục đích để rèn khả năng đọc và hiểu mã nguồn

– Đi thực tập và làm thêm tại các công ty công nghệ

– Đọc và viết các bài về công nghệ chuyên sâu, sách chuyên sâu; tham gia các nhóm, cộng đồng nghề nghiệp tại Việt nam và thế giới

Đọc thêm: https://legiacong.blogspot.com/2022/10/cach-hoc-5-mo-hinh-dreyfus.html

Quy tắc 10.000 giờ để có thể thuần thục một nghề

- Bạn học 8 tiếng mỗi ngày.

- Bạn học 5 ngày mỗi tuần.

- Số giờ học mỗi tuần là: 40 giờ/tuần

- Một năm có khoảng 52 tuần. 

- Một năm học được: 52 x 40 = 2.080 giờ

- 10.000 giờ/2.080 = 4.8 năm

1.4 Chatbot

Chatbot (gemini, copilot, chatgpt, grok) hoặc các sản phẩm AI khác là công cụ hỗ trợ, là trợ lý. Nó giúp tự động hóa một số công việc liên quan đến việc học, tư duy, tạo ra các sản phẩm liên quan đến tư duy (văn bản, bài học, mã nguồn) của con người.

Khi dùng chatbot để học, bạn có thể rơi vào 3 kịch bản sau:

- [1] Làm cho bạn: học, tư duy, suy nghĩ hiệu quả hơn.

- [2] Làm cho bạn: học, tư duy, suy nghĩ kém đi.

- [3] Làm cho bạn: không biết học, không biết tư duy, và không cần nghĩ.

Trong quá trình dùng chatbot để học, bạn nên cảnh giác với xu hướng thứ [2] và [3].

Chatbot nếu giúp được bạn học nhanh (nếu làm được), thì đó cũng chỉ là bước đầu. Bạn cần phải chuyển hóa kết quả học thành sản phẩm, giải pháp hữu ích.

Thực hành:

- Mỗi cá nhân lựa chọn chủ đề muốn học?

- Lựa chọn phương pháp học?

- Xây dựng học liệu trong quá trình học?

- Tạo ra sản phẩm, giải pháp hữu ích trong cuộc sống.

Một số chủ đề

- Chuỗi khối (blockchain)

- Điều khiển drone

- Làm phần mềm Desktop

- Làm web

- Làm mobile app

- Làm game

- Devops

- Bảo mật hệ thống

- Dữ liệu (phân tích dữ liệu, kỹ sư dữ liệu)

- Khởi nghiệp

Học dựa trên dự án (project-based learning)

Một số dự án (ứng dụng):

- Phần mềm (web, mobile app) để quản lý và theo dõi đơn hàng

- Phần mềm đặt xe giống grab

- Webapp bán hàng

- Ứng dụng IT trong khởi nghiệp

- Bảo mật hệ thống

- Devops

-----

Cập nhật: 5/6/2025

-----

Bài sau:

Web back-end (23) - Tạo các bảng và mối quan hệ

Bài trước: Web back-end (22) - Tạo cơ sở dữ liệu bằng Sequelize

-----

23. Tạo các bảng và mối quan hệ

23.1 Tạo các bảng có mối quan hệ 1-n

Vào cửa sổ dòng lệnh, tắt web server, nhập vào đoạn mã sau để tạo model cho bảng Images:

E:\TeoShop>sequelize model:create --name Image --attributes name:string,imagePath:string 

Sequelize CLI [Node: 22.14.0,

CLI: 6.6.2, ORM: 6.37.7]

New model was created at E:\TeoShop\models\image.js .

New migration was created at E:\TeoShop\migrations\20250506035103-create-image.js .

Nhập vào đoạn mã sau để tạo model cho bảng Brands:

E:\TeoShop>sequelize model:create --name Brand --attributes name:string,imagePath:string 

Sequelize CLI [Node: 22.14.0,

CLI: 6.6.2, ORM: 6.37.7]

New model was created at E:\TeoShop\models\brand.js .

New migration was created at E:\TeoShop\migrations\20250506035329-create-brand.js .

Tạo mối quan hệ 1-n

Mối quan hệ giữa 2 bảng Products và Images là 1-n, nghĩa là một sản phẩm (product) sẽ có nhiều hình ảnh (image).

Vào tập tin models\product.js, thêm đoạn mã sau:

[models\product.js]

  */

    static associate(models) {

      // define association here

      Product.hasMany(models.Image, { foreignKey: 'productId' });

    }

  }

  Product.init({

Hiểu đoạn mã nguồn là: một product thì có nhiều (hasMany) image, khóa ngoại trong bảng Images sẽ có tên là productId.

Vào tập tin models\image.js, thêm vào đoạn mã sau:

[models\image.js]

 */

    static associate(models) {

      // define association here

      Image.belongsTo(models.Product, { foreignKey:'productId'});

    }

  }

  Image.init({

Hiểu đoạn mã nguồn là: một image thuộc về (belongs to) một product, thông qua khóa ngoại productId.

Tương tự, mối quan hệ giữa 2 bảng Brands và Products là 1-n, nghĩa là một thương hiệu (brand) sẽ có nhiều sản phẩm (product).

Vào tập tin models\brand.js, thêm đoạn mã sau:

[models\brand.js]

    */

    static associate(models) {

      // define association here

      Brand.hasMany(models.Product, { foreignKey:'brandId' });

    }

  }

  Brand.init({

Hiểu đoạn mã nguồn là: một brand có nhiều (hasMany) product, thông qua khóa ngoại brandId.

Vào tập tin models\product.js, thêm đoạn mã sau:

[models\product.js]

static associate(models) {

      // define association here

      Product.hasMany(models.Image, { foreignKey: 'productId' });

      Product.belongsTo(models.Brand, { foreignKey:'brandId' } );

    }

Hiểu đoạn mã nguồn là: một product thuộc về (belongsTo) một brand, thông qua khóa ngoại brandId.

Để cập nhật các khai báo về mối quan hệ 1-n vừa khai báo ở trên vào cơ sở dữ liệu, chúng ta cần thực hiện các bước sau:

- Lưu lại mã nguồn của các tập tin vừa được thêm mã nguồn.

- Mở pgAdmin, xóa các bảng liên quan (Products).

- Khởi chạy lại web server.

- Mở trình duyệt web, gõ lại lệnh /createTables (http://localhost:9000/createTables).

- Nếu lệnh /createTables chạy thành công, bạn sẽ thấy dòng thông báo “tables created” trên trình duyệt

- Mở lại cơ sở dữ liệu trong pgAdmin sẽ thấy 3 bảng xuất hiện, trong mỗi bảng sẽ có thêm trường khóa ngoại (ví dụ, trong bảng Products sẽ là brandId; trong bảng Images sẽ là productId). Các trường createdAt và updateAt trong mỗi bảng cũng được tạo tự động. Trong mỗi bảng, bạn vào mục Constraints để xem các khóa ngoại đã được tạo ra (ví dụ Images_productId_fkey).

23.2 Tạo các bảng có mối quan hệ n-n

Quay trở lại các bảng dữ liệu của ứng dụng TeoShop, chúng ta có bảng Tags, dùng để lưu các thẻ (từ khóa, nhãn); thẻ này sẽ được gắn vào sản phẩm (product). Những thẻ này giúp mô tả các đặc điểm, phong cách, hoặc thuộc tính nổi bật của sản phẩm, từ đó hỗ trợ việc tìm kiếm, lọc và khám phá sản phẩm một cách hiệu quả hơn cho cả người quản lý và khách hàng.

Một product có thể gắn nhiều tag; một tag có thể gắn cho nhiều product. Do vậy, mối quan hệ giữa bảng Products và Tags là n - n (nhiều - nhiều).

Vào cửa sổ dòng lệnh, tắt web server, nhập vào đoạn mã sau để tạo model cho bảng Tags:

E:\TeoShop>sequelize model:create --name Tag --attributes name:string

Sequelize CLI [Node: 22.14.0,

CLI: 6.6.2, ORM: 6.37.7]

New model was created at E:\TeoShop\models\tag.js .

New migration was created at E:\TeoShop\migrations\20250506091413-create-tag.js .

Nhập tiếp đoạn mã sau để tạo model cho bảng ProductTags (vì bảng này chỉ có 2 thuộc tính là khóa ngoại, nên sẽ không cần tùy chọn --attributes, nhưng thiếu tùy chọn này lệnh sẽ bị lỗi, vì vậy chúng ta cứ thêm tùy chọn --attributes name:string rồi sẽ xóa sau):

E:\TeoShop>sequelize model:create --name ProductTag --attributes name:string

Sequelize CLI [Node: 22.14.0,

CLI: 6.6.2, ORM: 6.37.7] 

New model was created at E:\TeoShop\models\producttag.js .

New migration was created at E:\TeoShop\migrations\20250506091721-create-product-tag.js .

Để định nghĩa mối quan hệ nhiều-nhiều giữa bảng Products và Tags, chúng ta cần định nghĩa trên 3 model, gồm: product.js, tag.js và producttag.js.

Vào tập tin models\tag.js, thêm đoạn mã sau:

[models\tag.js]

     */

    static associate(models) {

      // define association here

      Tag.belongsToMany(models.Product, { through: 'ProductTag', foreignKey: 'tagId', otherKey: 'productId' });

    }

  }

  Tag.init({

Hiểu đoạn mã nguồn là: một tag thuộc về nhiều (belongsToMany) product, được thể hiện trong bảng ProductTags, với khóa chính được tạo ra từ 2 khóa ngoại là tagId và productId.

Tương tự, vào tập tin models\product.js, thêm vào đoạn mã sau:

[models\product.js]

      Product.hasMany(models.Image, { foreignKey: 'productId' });

      Product.belongsTo(models.Brand, { foreignKey:'brandId' } );

      Product.belongsToMany(models.Tag, { through: 'ProductTag', foreignKey: 'productId', otherKey: 'tagId' });

    }

  }

...

Tương tự, vào tập tin models\producttag.js, thêm vào đoạn mã sau:

[models\producttag.js]

    static associate(models) {

      // define association here

      ProductTag.belongsTo(models.Product, { foreignKey: 'productId' });

      ProductTag.belongsTo(models.Tag, { foreignKey: 'tagId' });

    }

  }

  ProductTag.init({

Chúng ta cũng xóa bỏ dòng tô đậm (tạo cột name: name: DataTypes.STRING) trong models\producttag.js

[models\producttag.js]

}

  ProductTag.init({

    name: DataTypes.STRING

  }, {

    sequelize,

    modelName: 'ProductTag',

  });

  return ProductTag;

Do chúng ta không chỉnh sửa các cột của bảng Products, nên chúng ta không cần xóa bảng Products, mà chỉ cần chạy lệnh \createTables để tạo bảng Tags và ProductTags từ model tag.js và producttag.js.

- Lưu lại mã nguồn các model: product.js, tag.js và producttag.js.

- Khởi chạy lại web server

- Mở trình duyệt, nhập vào đường dẫn: http://localhost:9000/createTables

- Nếu việc tạo bảng thành công, trình duyệt sẽ có dòng chữ “tables created”

- Vào pgAdmin sẽ thấy có bảng Tags, ProductTags được tạo ra.

Bạn có thể xem Sơ đồ quan hệ thực thể (ERD - Entity Relationship Diagram) của cơ sở dữ liệu teoshopDB. Ví dụ trong pgAdmin, chuột phải vào teoshopDB > chọn ERD For Database.

Xem hình minh họa ERD.

23.3 Bài tập

Bài tập 23.1 Tạo các bảng và thiết lập các quan hệ giữa các bảng.

-----

Cập nhật: 7/5/2025

Bài sau:

Web back-end (22) - Tạo cơ sở dữ liệu bằng Sequelize

Bài trước: Web back-end (21) - Lập trình với cơ sở dữ liệu 

-----

22 Tạo cơ sở dữ liệu bằng Sequelize

22.1 Tạo cơ sở dữ liệu rỗng

- Sử dụng pgAdmin (hoặc một phần mềm thao tác với Postgresql bất kỳ) để tạo một cơ sở dữ liệu rỗng (ví dụ, đặt tên là teoshopDB).

- Vào tập tin config/config.json của dự án (TeoShop), chỉnh sửa thông tin kết nối tới cơ sở dữ liệu.

[config/config.json]

{

  "development": {

    "username": "postgres",

    "password": "p@ssword1",

    "database": "teoshopDB",

    "host": "127.0.0.1",

    "dialect": "postgres"

  },

  "test": {

    "username": "root",

    "password": null,

    "database": "database_test",

Lưu ý: bạn sửa lại thông tin của mục password, database theo cài đặt trên máy của bạn.

22.2 Tạo lớp đối tượng

Vậy là chúng ta đã có cơ sở dữ liệu rỗng (tên là teoshopDB), chưa có bảng dữ liệu, chưa định nghĩa mối quan hệ giữa các bảng, chưa có dữ liệu.

Công việc tiếp theo chúng ta cần thực hiện là tạo các bảng cho cơ sở dữ liệu.

Để tạo bảng, chúng ta sẽ tạo lớp đối tượng tương ứng.

Ví dụ, chúng ta sẽ tạo lớp đối tượng có tên là Product (lưu ý: không có chữ s sau Product), bằng lệnh sau:

sequelize model:create --name Product --attributes name:string,imagePath:string

Trong đó,

- sequelize: lệnh của sequelize

- model:create: tạo model mới

- tùy chọn --name Product: tên của model sẽ tạo có tên là Product

- tùy chọn --attributes name:string,imagePath:string : định nghĩa tên và kiểu dữ liệu các cột của bảng. Bạn không nhất thiết phải liệt kê đầy đủ các cột của bảng ở dòng lệnh (vì dễ bị lỗi đánh máy), mà nên chỉnh sửa ở trong mã nguồn.

E:\TeoShop>sequelize model:create --name Product --attributes name:string,imagePath:string

Sequelize CLI [Node: 22.14.0,

CLI: 6.6.2, ORM: 6.37.7]

New model was created at E:\TeoShop\models\product.js .

New migration was created at E:\TeoShop\migrations\20250505121847-create-product.js .

Nếu lệnh sequelize model:create chạy thành công, nó sẽ tạo cho chúng ta 2 tập tin, là models\product.jsmigrations\ -create-product.js.

Chúng ta sẽ mở tập tin models\product.js để định nghĩa các cột còn lại của bảng Products (khi tạo bảng trong cơ sở dữ liệu sẽ có thêm chữ “s” sau chữ Product).

[models\product.js]

Product.init({

    name: DataTypes.STRING,

    imagePath: DataTypes.STRING,

    oldPrice: DataTypes.DECIMAL,

    summary: DataTypes.TEXT,

    description: DataTypes.TEXT,

    specification: DataTypes.TEXT,

    stars: DataTypes.FLOAT,

    quantity: DataTypes.INTEGER

  }, {

    sequelize,

    modelName: 'Product',

  });

Để thực thi nội dung đã được khai báo trong models\product.js, nhằm tạo ra bảng Products trong cơ sở dữ liệu teoshopDB, chúng ta sẽ viết đoạn mã trong TeoShop\index.js.

[TeoShop\index.js]

// khai bao de su dung engine da dinh nghia

app.set('view engine', 'hbs');

 

// routes va render trang index

app.get('/createTables', (req, res) => {

    let models = require('./models');

    models.sequelize.sync().then(()=> {

        res.send('tables created');

    });

});

app.get('/', (req, res) => {

    res.render('index'); // se lay index.hbs do vao {{{ body }}} trong main.hbs

});

Ý nghĩa của đoạn mã:

- Đoạn mã này định nghĩa một route GET tại /createTables. Khi người dùng truy cập đường dẫn này, ứng dụng sẽ:

- Tham chiếu tới (import) các định nghĩa model từ thư mục ./models.

- Gọi phương thức sync() của Sequelize để tạo các bảng trong cơ sở dữ liệu (nếu chúng chưa tồn tại) dựa trên các model đã định nghĩa.

- Sau khi quá trình đồng bộ hóa hoàn tất thành công, ứng dụng sẽ gửi phản hồi 'tables created' về cho client (trình duyệt). Học thêm về viết hàm theo kiểu Promise (.then()).

Lưu ý: đoạn mã này thường được sử dụng trong quá trình phát triển (development) hoặc trong các thiết lập ban đầu để nhanh chóng tạo cấu trúc cơ sở dữ liệu dựa trên các model đã định nghĩa. Trong môi trường triển khai (production), việc tự động tạo hoặc cập nhật bảng theo cách này thường không được khuyến khích hoặc cần được kiểm soát chặt chẽ hơn. Việc thay đổi schema cơ sở dữ liệu trong môi trường production có thể gây ra rủi ro mất dữ liệu hoặc ngưng hệ thống (downtime). Thay vào đó, người ta thường sử dụng migrations để quản lý các thay đổi lược đồ cơ sở dữ liệu một cách an toàn và có kiểm soát.

Lưu lại tập tin mã nguồn TeoShop\index.js, khởi động lại web server, mở trình duyệt, nhập vào đường dẫn: http://localhost:9000/createTables

Nếu quá trình tạo bảng thành công, bạn sẽ thấy trên trình duyệt xuất hiện dòng chữ “tables created”; mở cửa sổ dòng lệnh trên máy server sẽ thấy xuất các dòng lệnh tạo bảng; mở cơ sở dữ liệu (teoshopDB) trong pgAdmin sẽ thấy xuất hiện bảng Products với các cột đã định nghĩa (teoshopDB\Schemas\public\Tables).

22.3 Bài tập

Bài tập 22.1 Tạo bảng Products bằng Sequelize.

-----

Cập nhật: 6/5/2025

Bài sau: Web back-end (23) - Tạo các bảng và mối quan hệ