Cơ sở dữ liệu của web ghi chú online
Mình đang dự định làm web ghi chú online cho đồ án tốt nghiệp. Mình có thắc mắc này về phần cơ sở dữ liệu mong mọi người giải đáp. Nếu tạo 1 bảng là notes để quản lý các ghi chú người dùng tạo, mà 1 người dùng thì họ có thể tạo rất nhiều ghi chú, như vậy khi nhiều người dùng thì cái bảng notes đó rất rất nhiều dữ liệu. Như vậy thì việc truy xuất dữ liệu, xử lý thông tin cũng mất thời gian hơn, nhất là khi tìm kiếm dữ liệu hay quản lý notes trong admin sẽ khó khăn hơn phải ko?
Không biết như trang daynhauhoc này thì ad quản lý các bài post kiểu gì nhỉ?
Bạn @NLQ chưa học về cơ sở dữ liệu quan hệ và cách thiết kế CSDL à? Đến lúc làm đồ án rồi mà hỏi nghe như dân ngoại đạo về IT vậy? Mình không phải dân IT nhưng mình xin được “lên lớp” bạn như sau:
Bạn cần ôn lại môn CSDL quan hệ, chỗ thiết kế cơ sở dữ liệu, nhất là chương liên quan đến dạng chuẩn và chuẩn hoá cơ sở dữ liệu. (bước 1)
Sau khi có kết quả bước 1 rồi thì bạn áp dụng vào thiết kế các table cho đồ án tốt nghiệp quản lý ghi chú của bạn. Lúc này, bạn có thể hình dung được quy mô bạn sẽ định áp dụng cho quy mô ghi chú phục vụ bao nhiêu người? Có cần hy sinh “chuẩn” để đổi lấy tốc độ truy xuất vào dữ liệu hay không? Và như vậy, bạn sẽ thiết kế đạt đến chuẩn II, III, BC hay gì gì đó.
Giả sử là ứng dụng notes (cụ thể là các table liên quan đến user và note) mới đầu được thiết kế để phục vụ một công ty có 100 nhân viên, bình quân mỗi nhân viên mỗi giờ tạo ra 2 note mới. Như vậy, ta dễ hình dung, ngày 8 giờ làm việc:
2 note x 8 giờ x 100 nhân viên = 1.600 note/ngày. Như vậy, một tháng sẽ là 1.600 note x 31 ngày = 49.600 note (tức 49.600 dòng trong table notes của bạn), một năm là bao nhiêu,… từ đó nhân lên để hình dung. Sau đó, bạn tra cứu trên mạng xem với một table N cột, các kiểu dữ liệu là char, integer, varchar,… thì một truy vấn (trong tình huống viết câu query tệ hại nhất) mất bao nhiêu thời gian, rồi thì nếu tối ưu câu query lên,… sẽ ra N giây. Nói chung là tìm đúng cái hệ quản trị cơ sở dữ liệu quan hệ mà bạn đang dùng. Kết quả đó có chấp nhận được không? Mấy cái này mục đích là dự phòng nếu phải lên bảo vệ thầy giáo hỏi.
Giả sử nó lên tới hàng triệu dòng, và mỗi lần query mất đến 15 giây chẳng hạn, thầy giáo đặt câu hỏi như vậy, và bạn tra trên mạng cũng thấy vậy thì người thiết kế cơ sở dữ liệu sẽ có phương án dự phòng như thế nào? Tối ưu hoá cơ sở dữ liệu ra sao để một truy vấn tốc độ chỉ nhỏ hơn hoặc bằng 5 giây, lúc nào thì đã bó tay, cần phải trang bị thêm về phần cứng máy chủ cơ sở dữ liệu để khắc phục sự chậm chạp vì cơ sở dữ liệu quá bự?
Blah blah,… trường hợp các diễn đàn hay blog thì bạn cũng nhận xét là nó có những bài gọi là archive (tức là cũ sì rồi, ít ai truy cập đến, có truy cập đến họ sẵn sàng chịu tốc độ chậm một chút) thì bạn sẽ phân các note của bạn ra thành các table chia theo năm/ tháng để cất bớt những note quá cũ. Khi người ta tìm kiếm trên ứng dụng của bạn thì bạn có gợi ý/ hoặc thiết kế sao đó để họ chọn quãng thời gian để tìm vào table đã cất giữ, còn table notes mà bạn thiết kế chỉ để phục vụ cho năm hiện tại.
( Xin nói thêm là mình từng query vào một table có 53 cột trong cơ sở dữ liệu DB2 (do IBM thiết kế, bản miễn phí) có khoảng 700 ngàn dòng, thời gian trả về là 1,782 giây. Tốc độ như vầy không thành vấn đề lắm nếu làm mấy cái note niếc như đồ án này )
Nói tùm lum tá lả như trên, mấy anh em IT lại cho rằng mình “múa rìu qua mắt thợ”, một gã bán heo đất ở chợ thì biết cái éo gì. Xin dừng cuộc chém gió tại đây.
Ukm, mình học qua rồi bạn ạ, mình học IT nhưng tự nhận là vẫn còn kém mà, quảnh quẩn mấy cái truy vấn cơ bản thôi chứ biết gì mấy đâu.
Còn bạn, bạn nói nghe tự cao quá đấy bạn ạ. Sinh viên sắp tốt nghiệp thì sao chứ. Sinh viên hầu như chỉ quanh quẩn làm mấy cái trên localhost chứ có bao giờ động đến cái hệ thống thực tế lớn đâu? Cái gì vượt quá sức ko biết thì hỏi. Đâu phải ai cũng có những kiến thức như bạn.
Vâng bạn giỏi quá, mấy cái note niếc như này ăn thua gì đâu. Chỉ là cái đồ án nhỏ, ăn thua gì so với mấy cái hệ thống lớn thực tế. Nhưng mình đang bàn đến chữ “Nếu” bạn ạ. Nếu hệ thống của mình có hàng triệu người dùng thì sao? Bình thường mình chỉ lưu hết notes vào 1 bảng cho đơn giản. Vậy có phải là cái bảng đó quá lớn. Và mình muốn biết là có cách thiết kế # để tối ưu ko. Hỏi như thế thì giống với NGOẠI ĐẠO à. Chắc mình kém quá nên mới không biết. Bạn thông cảm.
Ví dụ bạn tìm kiếm trên Facebook 1 từ khoá bất kỳ, rồi chọn “bài viết” và “bất kỳ ai”. Ở Việt Nam có mấy chục triệu tài khoản FB. Mỗi tài khoản lại có rất nhiều bài viết. Vậy nó xây dựng CSDL ntn, chắc ko phải ném hết vào bảng “bài viết” như mấy cái ứng dụng nhỏ mình làm. Mong cao nhân như bạn thông não cho kẻ kém cỏi như mình biết với. Mình cảm ơn nhiều nhé
Nếu làm RDBMS thì cho với 1 bảng, thêm index để tăng hiệu suất. Nhớ gắn thêm audit (log system) vào các thao tác select, insert, update cần thiết. Cho app chạy 1 thời gian, phân tích cái nào truy xuất nhiều thì mới cải tiến. Có nhiều cách để cải tiến: tạo index, tạo view, duplicate lên mô hình Master-Slaved (quên tên), chuyển sang NoSQL (dùng cache, hay dùng document database)
Việc thiết kế CSDL ban đầu đáp ứng được yêu cầu truy xuất cao khó có thể thực hiện, không phải do không có các optimize, mà không biết nên optimze chỗ nào, cách nào phù hợp. Mỗi app khác nhau nên cách optimize cũng khác nhau.
Thôi nào…
Bạn muốn cho nó ra thực tế thì sử dụng các dịch vụ cloud service như Heroku hay thuê vps rồi cài web server xong up lên host, public cho người ta sử dụng. Tự khắc sau một khoảng thời gian bạn sẽ nhận ra những lỗi thực tế khi deploy hệ thống thôi
Đừng lanh quanh localhost, đăng ký ngay một tài khoản github + heroku rồi up webapp lên pls
Giờ mình mới bắt đầu làm bạn à. Vấn đề mình nói đến không phải chuyện này
Nếu bạn sử dụng csdl quan hệ
Nosql
Nếu bạn vẫn lo lắng về tốc độ truy vấn thì có thể sử dụng các hệ quản trị nosql hoặc firebase… bài toán sẽ được giải quyết ko quá khó khăn nhưng yêu cầu bạn có kinh nghiệm làm việc với nó
Kết : điều quan trọng khi thực hiện dự án này là bạn phải estimate được scope của chương trình và đưa ra phương án phù hợp. Với kinh nghiệm của mình thì với chương trình của bạn có thể sử dụng mysql host free trên amazon là có thể đáp ứng được. Nhân tiện, amazon cũng cung cấp rất nhiều tính năng hữu ích để giải quyết bài toán này, bạn lên trang chủ đọc nhé.