thắc mắc Cách thiết kế database cho hệ thống lớn

  • Người tạo chủ đề Người tạo chủ đề buiduchanh1995
  • Ngày bắt đầu Ngày bắt đầu
Bổ sung cho chủ thớt: Time Series (https://www.mongodb.com/docs/manual/core/timeseries-collections/)

Về mặt cơ bản như đã nói là MongoDb nó có hỗ trợ và lưu dưới dạng columnar data như Cassandra luôn nên thử tối ưu cái đã có đã.
Trước t cũng dùng thằng này, call nhiều lần hỗ trợ từ hãng ( do dùng Atlas ) để design solution. Trước đó cũng POC vs Timescale, cơ mà vấn đề maintain có khi thành ác mộng khi scale vs dữ liệu lớn nên quay xe ( kinh nghiệm xương máu khi tự vận hành thằng Dremio :big_smile: )
T thấy 1 nhược điểm của mấy cụ time serial db là k join đc, nên design ban đầu mà k tốt đến lúc query là oẳng hết :too_sad: Ông warehouse join đc thì tốn kém ( Bigquery ) hoặc ác mộng maintain (Timescale, Clickhouse ... )
Bonus chút là xài đồ chạy trên JVM khi scale nó cũng lắm issue rất khó fix kể cả report qua hãng, thi thoảng phải chơi thần chú restart =))
 
em hỏi ngu chút mấy db kiểu như influxdb, cassandra nó chỉ dùng cho IoT hả các bác. Em cũng kinh qua mấy domain như ecommerce hay bank chỉ thấy Postgres hoặc Mysql. Ko biết khi nào có cơ hội đụng mấy món lạ lùng này.
Cassandra là NoSQL, giống MongoDB, nó có cái hay riêng của nó
Ví dụ như app chat mà lưu SQL thì truy vấn ếu nhanh bằng NoSQL
App IOT cũng tương tự app chat
Còn mấy hãng bank hay ecommerce thì Tech Manager éo liều mạng để dùng đồ mã nguồn mở thôi. Bank toàn dùng Oracle giá bản quyền 17500$ 1 nhân CPU cơ mà fen
 
Sửa lần cuối:
em hỏi ngu chút mấy db kiểu như influxdb, cassandra nó chỉ dùng cho IoT hả các bác. Em cũng kinh qua mấy domain như ecommerce hay bank chỉ thấy Postgres hoặc Mysql. Ko biết khi nào có cơ hội đụng mấy món lạ lùng này.
Bank nếu muốn dùng NoSQL thì vẫn dùng được cho 1 số service như notification chẳn hạn, đúng là bank sẽ dùng RDBMS nhiều hơn.
 
Các bác cho mình hỏi thăm một chút. Giả sử mình có 1 API, API này cho phép user submit 1 đoạn text đã được user hash bằng BLAKE2 (mình đang tạm prefer cái này).

Backend sẽ tìm trong DB, nếu có tồn tại thì trả về 0 hoặc 1 để biểu thì có trong DB hay không là xong, dù khá là đơn giản nhưng cũng đối mặt với khả năng phía người dùng request đến rất nhiều vì vậy mình muốn xin ý kiến các bác về loại DB nên dùng (trường hợp này user chỉ có read/search) chứ không ghi vào DB, và cách thiết kế để đạt tốc độ cao nhất :big_smile:

Mình thì không chuyên về mảng này, nhưng mình có idea là tách bảng ra riêng không ràng buộc/quan hệ với các bảng khác
 
Các bác cho mình hỏi thăm một chút. Giả sử mình có 1 API, API này cho phép user submit 1 đoạn text đã được user hash bằng BLAKE2 (mình đang tạm prefer cái này).

Backend sẽ tìm trong DB, nếu có tồn tại thì trả về 0 hoặc 1 để biểu thì có trong DB hay không là xong, dù khá là đơn giản nhưng cũng đối mặt với khả năng phía người dùng request đến rất nhiều vì vậy mình muốn xin ý kiến các bác về loại DB nên dùng (trường hợp này user chỉ có read/search) chứ không ghi vào DB, và cách thiết kế để đạt tốc độ cao nhất :big_smile:

Mình thì không chuyên về mảng này, nhưng mình có idea là tách bảng ra riêng không ràng buộc/quan hệ với các bảng khác
Bước 1 thì cần hiểu bài toán và lựa chọn database đã.
Bài toán của bác có một số điểm chưa rõ ràng lắm. Bác đang cần tìm một đoạn text, đoạn phạm vi tìm kiếm của bác là tất cả table hay chỉ nằm trong một table thôi vậy?

Em không có kinh nghiệm nhiều với noSql, nhưng nếu chỉ là các tác vụ read/search thì có vẻ các database hệ noSql sẽ cho kết quả nhanh hơn.
Nhưng không có nghĩa là RDBMS không nhanh, tùy vào bài toàn mà chúng ta có thể tối ưu như nào.
 
Bước 1 thì cần hiểu bài toán và lựa chọn database đã.
Bài toán của bác có một số điểm chưa rõ ràng lắm. Bác đang cần tìm một đoạn text, đoạn phạm vi tìm kiếm của bác là tất cả table hay chỉ nằm trong một table thôi vậy?

Em không có kinh nghiệm nhiều với noSql, nhưng nếu chỉ là các tác vụ read/search thì có vẻ các database hệ noSql sẽ cho kết quả nhanh hơn.
Nhưng không có nghĩa là RDBMS không nhanh, tùy vào bài toàn mà chúng ta có thể tối ưu như nào.
giống như request login nhưng username 1 bảng riêng, password 1 bảng riêng ấy fen, và bài toán hiện tại của mình là search password nên chỉ cần 1 bảng, và hệ thống này cần select tốc độ cao nhất, chứ write thì 1 tháng mới write 1 lần @@
 
giống như request login nhưng username 1 bảng riêng, password 1 bảng riêng ấy fen, và bài toán hiện tại của mình là search password nên chỉ cần 1 bảng, và hệ thống này cần select tốc độ cao nhất, chứ write thì 1 tháng mới write 1 lần @@
Để cân nhắc thì đãng lẽ là sẽ cần đi từ tổng thể bài toán. Nếu cả hệ thống của bác update nhiều, chỉ có bảng password là ít update thì chúng ta cần ưu tiên cả hệ thống trước. Tuy nhiên thì vào vấn đề của bác trước:
- Bác muốn tìm kiếm dữ liệu nhanh nhất có thể trong một bảng. Vậy thì bác có thể làm như sau:

1. Index. Chắc chắn rồi, 80% khi tối ưu tốc độ query thì chúng ta sẽ nghĩ đến index đầu tiên. Bác tạo index cho field mà bác cần tìm kiếm.
2. Partition. Hiểu đơn giản thì đây là kỹ thuật chia nhỏ table ra thành các phân vùng nhỏ, khi bác thực hiện câu lệnh Select thì engine của database sẽ chỉ cần thực hiện tìm kiếm trong một vùng dữ liệu nhỏ thay vì quét cả cái bảng dữ liệu rất là lớn.
3. Hash join. Bác đang tách username 1 bảng và password một bảng. Em không hiểu mục đích tại sao bác lại làm như vậy lắm, nhưng nếu để join hai bảng với nhau thì Hash join là một chiến lược tốt nếu bác muốn tăng tốc query. Đánh đổi là bộ nhớ sẽ tốn nhiều hơn.
4. Cache, buffer pool. Đây là kỹ thuật mà bác nên thực hiện đầu tiên. Table của bác có tần suất write siêu thấp, cache và buffer pool là một lựa chọn rất tốt khi muốn tăng tốc query.

Để lựa chọn database.
  • Nếu bác nhiều tiền, oracle rất là ngon. Việc tối ưu partition và subpartition của oracle là không phải bàn cãi. Các thứ khác cũng rất ngon.
  • Nếu không muốn tốn tiền thì PostgreSql cũng rất ngon. PostgreSql có một điểm mạnh khi thực hiện Select đó là nó sẽ tập hợp nhiều điều kiện để đánh giá và đưa ra được cách thực thi câu lệnh mà tốn ít tài nguyên nhất. Với câu lệnh select đơn giản thì điều này không khác biệt lắm khi so với mysql hay mssql nhưng nếu câu lệnh phức tạp thì chênh lệch là rất rõ ràng. Tuy nhiên thì kiến trúc của postgreSql khiến cho việc update dữ liệu sẽ kém hiệu quả hơn các database còn lại. Tất nhiên là nếu tần suất update dữ liệu cho cả hệ thống là thấp thì cũng không sao.
 
Để cân nhắc thì sẽ cần đi từ tổng thể bài toán. Nếu cả hệ thống của bác update nhiều, chỉ có bảng password là ít update thì chúng ta cần ưu tiên cả hệ thống trước.
Vào vấn đề chính thì:
- Bác muốn tìm kiếm dữ liệu nhanh nhất có thể trong một bảng. Vậy thì bác có thể làm như sau:

1. Index. Chắc chắn rồi, 80% khi tối ưu tốc độ query thì chúng ta sẽ nghĩ đến index đầu tiên. Bác tạo index cho field mà bác cần tìm kiếm.
2. Partition. Hiểu đơn giản thì đây là kỹ thuật chia nhỏ table ra thành các phân vùng nhỏ, khi bác thực hiện câu lệnh Select thì engine của database sẽ chỉ cần thực hiện tìm kiếm trong một vùng dữ liệu nhỏ thay vì quét cả cái bảng dữ liệu rất là lớn.
3. Hash join. Bác đang tách username 1 bảng và password một bảng. Em không hiểu mục đích tại sao bác lại làm như vậy lắm, nhưng nếu để join hai bảng với nhau thì Hash join là một chiến lược tốt nếu bác muốn tăng tốc query. Đánh đổi là bộ nhớ sẽ tốn nhiều hơn.
4. Cache, buffer pool. Đây là kỹ thuật mà bác nên thực hiện đầu tiên. Table của bác có tần suất write siêu thấp, cache và buffer pool là một lựa chọn rất tốt khi muốn tăng tốc query.

Để lựa chọn database.
  • Nếu bác nhiều tiền, oracle rất là ngon. Việc tối ưu partition và subpartition của oracle là không phải bàn cãi. Các thứ khác cũng rất ngon.
  • Nếu không muốn tốn tiền thì PostgreSql cũng rất ngon. PostgreSql có một điểm mạnh khi thực hiện Select đó là nó sẽ tập hợp nhiều điều kiện để đánh giá và đưa ra được cách thực thi câu lệnh mà tốn ít tài nguyên nhất. Với câu lệnh select đơn giản thì điều này không khác biệt lắm khi so với mysql hay mssql nhưng nếu câu lệnh phức tạp thì chênh lệch là rất rõ ràng. Tuy nhiên thì kiến trúc của postgreSql khiến cho việc update dữ liệu sẽ kém hiệu quả hơn các database còn lại. Tất nhiên là nếu tần suất update dữ liệu cho cả hệ thống là thấp thì cũng không sao.
Thank bác rất nhiều, hệ thống này em chỉ thiết kế để search password, gần như không có update mà chỉ có search, và chỉ search password chứ không search username để login ạ
chắc em sẽ dùng PosgreSQL vì cũng không có kinh phí ấy bác ^^
 
giống như request login nhưng username 1 bảng riêng, password 1 bảng riêng ấy fen, và bài toán hiện tại của mình là search password nên chỉ cần 1 bảng, và hệ thống này cần select tốc độ cao nhất, chứ write thì 1 tháng mới write 1 lần @@
Dùng SQL nhưng đánh index đúng mới quan trọng. Xem thử database có hỗ trợ hash index là tốt nhất.
 
Các bác cho mình hỏi thăm một chút. Giả sử mình có 1 API, API này cho phép user submit 1 đoạn text đã được user hash bằng BLAKE2 (mình đang tạm prefer cái này).

Backend sẽ tìm trong DB, nếu có tồn tại thì trả về 0 hoặc 1 để biểu thì có trong DB hay không là xong, dù khá là đơn giản nhưng cũng đối mặt với khả năng phía người dùng request đến rất nhiều vì vậy mình muốn xin ý kiến các bác về loại DB nên dùng (trường hợp này user chỉ có read/search) chứ không ghi vào DB, và cách thiết kế để đạt tốc độ cao nhất :big_smile:

Mình thì không chuyên về mảng này, nhưng mình có idea là tách bảng ra riêng không ràng buộc/quan hệ với các bảng khác
Dùng Nosql, hoặc sql đều đc cả. Còn việc user load true false thì đơn giản là dùng redis ở giữa thôi. Cache cái kết quả yes no vô Redis hoặc In memory cache.
Còn nếu có tầm 1k request 1s cho 1 thằng user để search cái này thì sẽ dính 1 vài vấn đề nên optimize sau

via theNEXTvoz for iPhone
 
các bác cho em hỏi em có 3 bảng user, shop, company có quan hệ one to many với 1 bảng address . Thì em nên lưu cả 3 id của 3 bảng vào address không ạ. nếu làm thế thì khi thêm địa chỉ cho 1 trong 3 bảng thì 2 id kia sẽ bị null ạ. Em nên giải quyết như nào vậy các bác
 
các bác cho em hỏi em có 3 bảng user, shop, company có quan hệ one to many với 1 bảng address . Thì em nên lưu cả 3 id của 3 bảng vào address không ạ. nếu làm thế thì khi thêm địa chỉ cho 1 trong 3 bảng thì 2 id kia sẽ bị null ạ. Em nên giải quyết như nào vậy các bác
thì null cho cột thôi, có vấn đề gì? ko cần tái sử dụng vì chả cần thiết

mà thực tế thường thấy ít khi có bảng address, các cột về address đặt luôn trong các bảng user, shop, company luôn, như cột state, province, district, ward...

k cần chuẩn hóa 1 cách quá mức
 
thì null cho cột thôi, có vấn đề gì? ko cần tái sử dụng vì chả cần thiết

mà thực tế thường thấy ít khi có bảng address, các cột về address đặt luôn trong các bảng user, shop, company luôn, như cột state, province, district, ward...

k cần chuẩn hóa 1 cách quá mức
tự dưng thấy có 2 cột null nhìn nó hơi đần với sợ sau mà nhiều dữ liệu nó thành dư thừa á bác
 
tự dưng thấy có 2 cột null nhìn nó hơi đần với sợ sau mà nhiều dữ liệu nó thành dư thừa á bác
nếu ko thích thừa thì dùng onetoone, các bảng user shop company có cột address_id trỏ đến cột id của bảng address là đc

ko có vụ user, company, shop có cùng address, điều này là vô lý

Dự án thực tế thì hàng chục cột null là bthg, xấu nhưng chạy đc, phù hợp nghiệp vụ
 
nếu ko thích thừa thì dùng onetoone, các bảng user shop company có cột address_id trỏ đến cột id của bảng address là đc

ko có vụ user, company, shop có cùng address, điều này là vô lý

Dự án thực tế thì hàng chục cột null là bthg, xấu nhưng chạy đc, phù hợp nghiệp vụ
em cảm ơn bác :3
 

Thống kê chủ đề

Ngày tạo
buiduchanh1995,
Người trả lời cuối
Love U So Much,
Trả lời
63
Lượt xem
16.419
Quay lại
Lên đầu trang