-
Design Pattern
- Singleton Design Pattern
- Factory Design Pattern
- Factory Method Design Pattern
- Abstract Factory Design Pattern
- Builder Design Pattern
- Prototype Design Pattern
- Object Pool Design Pattern
- Chain of Responsibility Design Pattern
- Command Design Pattern
- Interpreter Design Pattern
- Iterator Design Pattern
- Mediator Design Pattern
- Memento Design Pattern
- Observer Design Pattern
- Observer Design Pattern - Xử Lý Exception
- Strategy Design Pattern
- Template Method Design Pattern
- Visitor Design Pattern
- Null Object Design Pattern
- Adapter Design Pattern
- Bridge Design Pattern
- Composite Design Pattern
- Decorator Design Pattern
- Flyweight Design Pattern
- Proxy Design Pattern
- S.O.L.I.D
- Clean code
- Lập trình socket
- Java Core
- Multi-Thread
- Spring
- Java Web
- Memory Caching
- Message Queue
- DevOps
- Xây dựng một nền tảng
- MongoDB
- MySQL timestamp
- Properties vs yaml
- Kotlin
- Lập Trình Machine Learning với PyTorch
- Mã Nguồn Mở
- Ezy HTTP
- Free Chat
- Một số kinh nghiệm với Git
- Review cho đồng nghiệp!
- Kinh nghiệm phát triển dự án phức tạp, nhiều người - Tuân thủ
- Kinh nghiệm phát triển dự án phức tạp, nhiều người - Lựa chọn người đi cùng
- Ngành công nghiệp phần mềm tại Việt Nam - Mới chỉ là bắt đầu.
- Ngành công nghiệp phần mềm tại Việt Nam - Dây chuyền sản xuất.
- Ngành công nghiệp phần mềm tại Việt Nam - Thị trường
- Ngành công nghiệp phần mềm tại Việt Nam - Công ăn việc làm
- Setup Dev Environment
- Hello World
- Create a Server Project
- Handle Client Requests
- Using ezyfox-server-csharp-client
- Using ezyfox-es6-client
- Client React.js Interaction
- Build And Deploy In Local
- Tham gia phát triển open source!
- Buôn có bạn, bán có phường
- Đam mê đi đâu rồi?
- Giữa lửa đam mê!
- Tương lai nào cho tester? Thay đổi để dẫn đầu xu thế!
- Tương lai nào cho tester? - Khi thế sự đổi thay!
- Tương lai nào cho lập trình viên? Khi không có hệ quy chiếu!
- Tương lai nào cho lập trình viên - Làm đến bao nhiêu tuổi?
- Tương lai nào cho lập trình viên? Có làm giàu được không?
- Tương lai nào cho lập trình viên? Có cân bằng cuộc sống được không?
- Tương lai nào cho lập trình viên - Nhảy việc đến khi nào?
- Tương lai nào cho lập trình viên - Con đường sự nghiệp (Career path)!
- Tương lai nào cho lập trình viên - Tổng kết lại!
- Con đường sự nghiệp cho lập trình viên - Giai đoạn sơ cấp (Junior)!
- Con đường sự nghiệp cho lập trình viên - Giai đoạn trung cấp (Intermediate)!
- Con đường sự nghiệp cho lập trình viên - Giai đoạn lành nghề (Senior)!
- Giai đoạn lành nghề (Senior) - Giữa những hoang mang!
- Giai đoạn lành nghề (Senior) - Phân hoá trong doanh nghiệp!
- Con đường sự nghiệp cho lập trình viên - Trở thành chuyên gia (Expert)!
- Con đường sự nghiệp cho lập trình viên - Trở thành người ảnh hưởng (Influencer)!
- Các giai đoạn phát triển của lập trình viên - Tổng kết lại!
- Metaverse - Câu chuyện 10 nghìn CCU (Người tham gia đồng thời)
- Metaverse có khả thi ở Việt Nam?
- Lựa chọn nghề nghiệp - DevOps!
- Lựa chọn nghề nghiệp - Project Manager (PM)!
- Lựa chọn nghề nghiệp - Data Engineer!
- Lựa chọn nghề nghiệp - BackEnd Engineer!
- “Talk is cheap. Show me the code” ― Linus Torvalds
- Lựa chọn nghề nghiệp - Web Front-End Engineer!
- Lựa chọn nghề nghiệp - Mobile Engineer!
- Lựa chọn nghề nghiệp - Game Engineer!
- Lựa chọn nghề nghiệp - Product Owner!
- Tuổi trẻ cần đột phá!
- Tuổi trẻ cần sự đồng cảm!
- Tuổi trẻ - điều đáng sợ đầu tiên là gì?
- Tuổi trẻ - Điều đáng sợ thứ 2 là gì?
- Tuổi trẻ - Điều đáng sợ thứ 3 là gì?
- Tuổi trẻ - Điều đáng sợ thứ 4 là gì?
- Nếu tận dụng hết năng lực thì sẽ thế nào?
- Tuổi trẻ - Điều đáng sợ thứ 5 là gì?
- Tuổi trẻ - Điều đáng sợ thứ 6 là gì?
- Tuổi trẻ - Điều đáng sợ thứ 7 là gì?
- Tuổi trẻ - ham học hỏi là như thế nào?
- Đầu tư cho bản thân là gì?
- Học chủ động!
- Có nên quay lại công ty cũ?
- Làm cho startup (công ty nhỏ) hay làm cho công ty lớn? (Phần 1)
- Làm cho startup (công ty nhỏ) hay làm cho công ty lớn? (Phần 2)
- Làm cho startup (công ty nhỏ) hay làm cho công ty lớn? (Phần 3)
- Tự học
- Học tập tại doanh nghiệp
- Học tại trung tâm
- Cách đọc sách kỹ thuật hiệu quả
- Học trong một tổ chức mã nguồn mở.
- Câu chuyện lập trình viên - Công việc đầu tiên
- Câu chuyện lập trình viên - Mức lương đầu tiên
- Câu chuyện lập trình viên - 2018
- Định hướng là gì?
- Wordpress nguy hiểm thế nào?
- Danh sách 10 trung tâm đào tạo trình uy tín, chất lượng ở Hà Nội
Tranh luận không hồi kết
Giá như thế giới chỉ có một lựa chọn duy nhất thì có phải tốt không nhỉ? Có phải đỡ đau đầu lựa chọn giữa cái này cái kia, các anh em cũng đỡ phải tranh luận cái này hay hơn cái kia, đỡ mất tinh thần đoàn kết hay không, :)
Hiện tại chúng ta đang tồn tại hai kiểu cơ sở dữ liệu chính:
- NoSQL: loại cơ sở dữ liệu ít quan hệ, chúng ta sẽ thường tổ chức dữ liệu ở dạng key-value để lưu trữ và truy xuất nhanh. Các hệ quản trị cơ sở dữ liệu dạng này cũng không hỗ trợ các câu lệnh join phức tạp (thậm chí là không hỗ trợ câu lệnh join luôn). Muốn join được các bảng, chúng ta sẽ cần làm ở tầng ứng dụng. Một số hệ quản trị cơ sở dữ liệu nổi bật với NoSQL hiện nay đó là: MongoDB, HBase và Cassandra
- MySQL: ra đời trước NoSQL và phổ biến hơn NoSQL, loại cơ sở dữ liệu này thường được tổ chức thành các bảng phức tạp, được liên kết với nhau thông qua khoá chính và khoá ngoại. Các hệ quản trị cơ sở dữ liệu quan hệ thường hỗ trợ các câu lệnh join rất mạnh, một trong các số đó phải nói đến: MySQL, Oracle, SQL Server, PostgreSQL
Lựa chọn không dễ dàng
Đầu tiên chúng ta hãy nói đến ứng dụng chat của chúng ta.
- Chúng ta mong muốn Freechat sẽ đạt được 10.000 message mỗi ngày, vậy 1 năm chúng ta sẽ có 3.650.000 message
- Sẽ có 2 chức năng chính đó là lưu lại message và lấy danh sách các message cũ, đối với các nghiệp vụ tìm kiếm message phức tạp chúng ta sẽ truy vấn thông qua hệ thống elasticsearch riêng
Với số lượng message khiêm tốn và yêu cầu đơn giản như trên thì thực ra dùng cơ sở dữ liệu nào cũng được, tuy nhiên chúng ta vẫn muốn có sự lựa chọn đơn giản và đạt hiệu suất cao nhất.
Dù có đọc bao nhiêu tài liệu, có nghe bao nhiêu người nói đi chăng nữa cũng không bằng việc chúng ta bắt tay luôn vào test thử với MongoDB và MySQL.
Tiến hành thử nghiệm
Kịch bản thử nghiệm sẽ là: insert 10.000 message vào trong cơ sở dữ liệu và đo thời gian. Message của chúng ta sẽ có dạng:
public class ChatMessage {
private long id;
private boolean read;
private String message;
private long channelId;
private String sender;
private String sentClientMessageId;
}
Đầu tiên, hãy bắt đầu với MongoDB
Với MongoDB
Bước 1: Tạo cơ sở dữ liệu và gán quyền truy cập như sau:
use freechat-test
db.createUser(
{
user:"freechat-test",
pwd:"123456",
roles:[ { role: "readWrite", db: "freechat-test" }]
}
)
Bước 2. Tạo đối tượng Repository
để giao tiếp với cơ sở dữ liệu:
EzyDatabaseContext context = new EzyMongoDatabaseContextBuilder()
.build();
return context.getRepository(MongoMessageRepository.class);
Bước 3. Lưu 10.000 message vào cơ sở dữ liệu
long start = System.currentTimeMillis();
for(List<ChatMessage> messageList : messageLists) {
for(ChatMessage message : messageList) {
repo.save(message);
}
}
long elapsedTime = System.currentTimeMillis() - start;
System.out.println(elapsedTime);
Ví dụ đầy đủ, bạn có thể tham khảo tại đây
Bước 4. Thực thi và chúng ta nhận được kết quả: 3782
millis giây
Với MySQL
Bước 1: Tạo cơ sở dữ liệu và bảng như sau:
CREATE SCHEMA `freechat-test` DEFAULT CHARACTER SET utf8mb4 ;
CREATE TABLE `message` (
`id` bigint NOT NULL AUTO_INCREMENT,
`isRead` tinyint(1) DEFAULT NULL,
`message` varchar(300) DEFAULT NULL,
`channelId` bigint DEFAULT NULL,
`sender` varchar(45) DEFAULT NULL,
`sentClientMessageId` varchar(45) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
Bước 2. Tạo đối tượng Repository
để giao tiếp với cơ sở dữ liệu:
private static MySQLMessageRepository getMessageRepository() {
EzyDatabaseContext context = databaseContext();
return context.getRepository(MySQLMessageRepository.class);
}
private static EzyDatabaseContext databaseContext() {
return new EzyJpaDatabaseContextBuilder()
.build();
}
private static EntityManagerFactory entityManagerFactory() {
return new EzyJpaEntityManagerFactoryLoader()
.load("Test");
}
private static DataSource dataSource() {
return new EzyJpaDataSourceLoader()
.load();
}
Bước 3. Lưu 10.000 message vào cơ sở dữ liệu
long start = System.currentTimeMillis();
for(List<ChatMessage> messageList : messageLists) {
for(ChatMessage message : messageList) {
repo.save(message);
}
}
long elapsedTime = System.currentTimeMillis() - start;
System.out.println(elapsedTime);
Ví dụ đầy đủ, bạn có thể tham khảo tại đây
Bước 4. Thực thi và chúng ta nhận được kết quả: 38101
millis giây
Kết luận
Rõ ràng MongoDB (NoSQL) đơn giản hơn so với MySQL (SQL) rất nhiều kể từ việc tạo bảng cho đến cấu hình trong code. Thêm vào nữa đó là tốc độ lưu trữ của MongoDB nhanh hơn MySQL rất nhiều. Nên ở thời điểm hiện tại, bắt đầu dự án với thời gian và kinh phí eo hẹp, chúng ta sẽ lựa chọn MongoDB. Còn vì sao lại có sự khác biệt như vậy mình sẽ nói ở những bài viết khác nhé.
Tham khảo
-
Design Pattern
- Singleton Design Pattern
- Factory Design Pattern
- Factory Method Design Pattern
- Abstract Factory Design Pattern
- Builder Design Pattern
- Prototype Design Pattern
- Object Pool Design Pattern
- Chain of Responsibility Design Pattern
- Command Design Pattern
- Interpreter Design Pattern
- Iterator Design Pattern
- Mediator Design Pattern
- Memento Design Pattern
- Observer Design Pattern
- Observer Design Pattern - Xử Lý Exception
- Strategy Design Pattern
- Template Method Design Pattern
- Visitor Design Pattern
- Null Object Design Pattern
- Adapter Design Pattern
- Bridge Design Pattern
- Composite Design Pattern
- Decorator Design Pattern
- Flyweight Design Pattern
- Proxy Design Pattern
- S.O.L.I.D
- Clean code
- Lập trình socket
- Java Core
- Multi-Thread
- Spring
- Java Web
- Memory Caching
- Message Queue
- DevOps
- Xây dựng một nền tảng
- MongoDB
- MySQL timestamp
- Properties vs yaml
- Kotlin
- Lập Trình Machine Learning với PyTorch
- Mã Nguồn Mở
- Ezy HTTP
- Free Chat
- Một số kinh nghiệm với Git
- Review cho đồng nghiệp!
- Kinh nghiệm phát triển dự án phức tạp, nhiều người - Tuân thủ
- Kinh nghiệm phát triển dự án phức tạp, nhiều người - Lựa chọn người đi cùng
- Ngành công nghiệp phần mềm tại Việt Nam - Mới chỉ là bắt đầu.
- Ngành công nghiệp phần mềm tại Việt Nam - Dây chuyền sản xuất.
- Ngành công nghiệp phần mềm tại Việt Nam - Thị trường
- Ngành công nghiệp phần mềm tại Việt Nam - Công ăn việc làm
- Setup Dev Environment
- Hello World
- Create a Server Project
- Handle Client Requests
- Using ezyfox-server-csharp-client
- Using ezyfox-es6-client
- Client React.js Interaction
- Build And Deploy In Local
- Tham gia phát triển open source!
- Buôn có bạn, bán có phường
- Đam mê đi đâu rồi?
- Giữa lửa đam mê!
- Tương lai nào cho tester? Thay đổi để dẫn đầu xu thế!
- Tương lai nào cho tester? - Khi thế sự đổi thay!
- Tương lai nào cho lập trình viên? Khi không có hệ quy chiếu!
- Tương lai nào cho lập trình viên - Làm đến bao nhiêu tuổi?
- Tương lai nào cho lập trình viên? Có làm giàu được không?
- Tương lai nào cho lập trình viên? Có cân bằng cuộc sống được không?
- Tương lai nào cho lập trình viên - Nhảy việc đến khi nào?
- Tương lai nào cho lập trình viên - Con đường sự nghiệp (Career path)!
- Tương lai nào cho lập trình viên - Tổng kết lại!
- Con đường sự nghiệp cho lập trình viên - Giai đoạn sơ cấp (Junior)!
- Con đường sự nghiệp cho lập trình viên - Giai đoạn trung cấp (Intermediate)!
- Con đường sự nghiệp cho lập trình viên - Giai đoạn lành nghề (Senior)!
- Giai đoạn lành nghề (Senior) - Giữa những hoang mang!
- Giai đoạn lành nghề (Senior) - Phân hoá trong doanh nghiệp!
- Con đường sự nghiệp cho lập trình viên - Trở thành chuyên gia (Expert)!
- Con đường sự nghiệp cho lập trình viên - Trở thành người ảnh hưởng (Influencer)!
- Các giai đoạn phát triển của lập trình viên - Tổng kết lại!
- Metaverse - Câu chuyện 10 nghìn CCU (Người tham gia đồng thời)
- Metaverse có khả thi ở Việt Nam?
- Lựa chọn nghề nghiệp - DevOps!
- Lựa chọn nghề nghiệp - Project Manager (PM)!
- Lựa chọn nghề nghiệp - Data Engineer!
- Lựa chọn nghề nghiệp - BackEnd Engineer!
- “Talk is cheap. Show me the code” ― Linus Torvalds
- Lựa chọn nghề nghiệp - Web Front-End Engineer!
- Lựa chọn nghề nghiệp - Mobile Engineer!
- Lựa chọn nghề nghiệp - Game Engineer!
- Lựa chọn nghề nghiệp - Product Owner!
- Tuổi trẻ cần đột phá!
- Tuổi trẻ cần sự đồng cảm!
- Tuổi trẻ - điều đáng sợ đầu tiên là gì?
- Tuổi trẻ - Điều đáng sợ thứ 2 là gì?
- Tuổi trẻ - Điều đáng sợ thứ 3 là gì?
- Tuổi trẻ - Điều đáng sợ thứ 4 là gì?
- Nếu tận dụng hết năng lực thì sẽ thế nào?
- Tuổi trẻ - Điều đáng sợ thứ 5 là gì?
- Tuổi trẻ - Điều đáng sợ thứ 6 là gì?
- Tuổi trẻ - Điều đáng sợ thứ 7 là gì?
- Tuổi trẻ - ham học hỏi là như thế nào?
- Đầu tư cho bản thân là gì?
- Học chủ động!
- Có nên quay lại công ty cũ?
- Làm cho startup (công ty nhỏ) hay làm cho công ty lớn? (Phần 1)
- Làm cho startup (công ty nhỏ) hay làm cho công ty lớn? (Phần 2)
- Làm cho startup (công ty nhỏ) hay làm cho công ty lớn? (Phần 3)
- Tự học
- Học tập tại doanh nghiệp
- Học tại trung tâm
- Cách đọc sách kỹ thuật hiệu quả
- Học trong một tổ chức mã nguồn mở.
- Câu chuyện lập trình viên - Công việc đầu tiên
- Câu chuyện lập trình viên - Mức lương đầu tiên
- Câu chuyện lập trình viên - 2018
- Định hướng là gì?
- Wordpress nguy hiểm thế nào?
- Danh sách 10 trung tâm đào tạo trình uy tín, chất lượng ở Hà Nội