Cách tốt nhất để lưu trữ tin nhắn trò chuyện trong cơ sở dữ liệu? [đóng cửa]


82

Tôi đang xây dựng một ứng dụng trò chuyện và tôi muốn ghi lại toàn bộ lịch sử tất cả các tin nhắn từng được gửi trong cuộc trò chuyện. Hiện tại, tôi đang lưu trữ từng tin nhắn dưới dạng một hàng trong bảng được gọi là 'tin nhắn'. Tôi biết rằng bảng này có thể phát triển rất lớn vì ngay cả những thông báo nhỏ như 'Chào' cũng sẽ có bản ghi cơ sở dữ liệu của riêng chúng.

Bất cứ ai có thể giới thiệu một giải pháp mysql có thể mở rộng hơn không? Tôi không yêu cầu từng tin nhắn phải có thể tìm kiếm, có thể chỉnh sửa hoặc xóa được. Toàn bộ cuộc trò chuyện có thể được lưu trữ trong một trường lớn không?

Rất thích nghe ý kiến ​​của bạn!


12
nếu những thông báo này không cần phải có thể tìm kiếm được hoặc có thể chỉnh sửa, thì không có lý do gì để giữ bên trong cơ sở dữ liệu
ajreal

20
Tôi khuyên bạn nên bắt đầu dễ dàng, suy nghĩ đơn giản, sử dụng cơ sở dữ liệu quan hệ và nếu việc mở rộng quy mô trở thành một vấn đề, hãy giải quyết nó! Quá nhiều người quan tâm đến các kịch bản sẽ không bao giờ xảy ra bởi vì họ dành quá nhiều thời gian để xây dựng cơ sở hạ tầng hoàn hảo và họ sẽ không có thời gian để tập trung vào những gì quan trọng.
swwin

Câu trả lời:


47

Không có gì sai khi lưu toàn bộ lịch sử trong cơ sở dữ liệu, chúng được chuẩn bị cho loại nhiệm vụ đó.

Trên thực tế, bạn có thể tìm thấy ở đây trong Stack Overflow một liên kết đến một lược đồ mẫu cho một cuộc trò chuyện: example

Nếu bạn vẫn lo lắng về kích thước, bạn có thể áp dụng một số tối ưu hóa cho các thư nhóm, chẳng hạn như thêm bộ đệm vào ứng dụng của bạn mà bạn chỉ đẩy sau một thời gian (như 1 phút hoặc lâu hơn); theo cách đó bạn sẽ tránh chỉ có một dòng tin nhắn


15

Nếu bạn có thể tránh nhu cầu ghi đồng thời vào một tệp duy nhất, thì có vẻ như bạn không cần cơ sở dữ liệu để lưu trữ các tin nhắn trò chuyện.

Chỉ cần nối cuộc hội thoại vào một tệp văn bản (1 tệp cho mỗi người dùng \ cuộc hội thoại). và có cấu trúc thư mục / tệp

Đây là một cái nhìn đơn giản về cấu trúc tệp:

chat-1-bob.txt
        201101011029, hi
        201101011030, fine thanks.

chat-1-jen.txt
        201101011030, how are you?
        201101011035, have you spoken to bill recently?

chat-2-bob.txt
        201101021200, hi
        201101021222, about 12:22
chat-2-bill.txt
        201101021201, Hey Bob,
        201101021203, what time do you call this?

Sau đó, bạn sẽ chỉ cần lưu trữ userid, id hội thoại (hướng dẫn?) & Tham chiếu đến tên tệp.

Tôi nghĩ rằng bạn sẽ khó có được một giải pháp có thể mở rộng đơn giản hơn.

Bạn cũng có thể sử dụng LOAD_FILEđể lấy dữ liệu, hãy xem: http://dev.mysql.com/doc/refman/5.0/en/string-functions.html

Nếu bạn có yêu cầu xây dựng lại một cuộc trò chuyện, bạn sẽ cần đặt một giá trị (ngày giờ) cùng với tin nhắn trò chuyện đã gửi của bạn (trong tệp) để cho phép bạn hợp nhất và sắp xếp các tệp, nhưng tại thời điểm này, có lẽ đó là một ý tưởng hay để xem xét sử dụng cơ sở dữ liệu.


1
Điều này nghe có vẻ tuyệt vời. Bất cứ ai có thể phản đối lập luận này?
Chuyến đi

74
Ghi vào một tập tin là một ý tưởng tồi tệ. Trong hầu hết các môi trường hoặc cụm phía máy chủ, bạn thậm chí sẽ không đảm bảo yêu cầu thứ hai của mình thậm chí đã kết thúc trên cùng một máy chủ với tệp. Việc ghi hệ thống tệp rất chậm và I / O bị ràng buộc. Xin lỗi, tôi không thể tin rằng điều này có nhiều phiếu bầu đến vậy.
Andy Fusniak

6
xin lỗi, tôi thực sự trả lời câu hỏi không tạo ra kịch bản hư cấu. Hiện tại, các thông báo vẫn được lưu vào cơ sở dữ liệu, vậy tại sao một hệ thống tệp đơn giản lại ghi chậm hơn nhiều. Ngoài ra, hãy đọc câu trả lời của tôi 1 tệp cho mỗi người dùng \ cuộc trò chuyện !!! (trên cụm hư cấu của bạn, tôi đã cài đặt một FSA-SAN). Yêu cầu OP nghe giống như ghi nhật ký \ kiểm toán, theo tôi, nó thuộc về một tệp.
Kevin Burton

5
Việc ghi và đọc một tệp là việc sử dụng nhiều tài nguyên. Tôi nghĩ rằng việc sử dụng cơ sở dữ liệu dưới bất kỳ hình thức nào sẽ giúp giảm thiểu sự chậm trễ tài nguyên đó. Vào cuối ngày, cơ sở dữ liệu cũng lưu trữ những thông tin đó vào tệp (chỉ khác một chút). Tôi nghĩ rằng ý tưởng đưa ra là tuyệt vời để lưu trữ các cuộc trò chuyện được lưu trữ hoặc các cuộc trò chuyện cũ hơn 1 năm hoặc lâu hơn. Nhưng không có gì đánh bại một db đơn giản ở đây.
Jay Patel - PayPal

3
OP nói rõ trong cơ sở dữ liệu, ngoài ý tưởng khủng khiếp này, đây không phải trả lời câu hỏi
Lyoneel

2

Bạn có thể tạo cơ sở dữ liệu cho x cuộc hội thoại chứa tất cả tin nhắn của những cuộc hội thoại này. Điều này sẽ cho phép bạn thêm một Cơ sở dữ liệu (hoặc máy chủ) mới mỗi khi x vượt quá. X là số cuộc hội thoại mà cơ sở hạ tầng của bạn hỗ trợ (tùy thuộc vào phần cứng của bạn, ...).

Vấn đề vẫn là, có thể có các cuộc hội thoại lớn (với rất nhiều thư) trên cùng một cơ sở dữ liệu. Ví dụ bạn có cơ sở dữ liệu A và cơ sở dữ liệu B, mỗi nơi lưu trữ 1000 cuộc hội thoại. Có khả năng là có nhiều cuộc hội thoại "lớn" hơn trên máy chủ A so với máy chủ B (vì đây là nội dung do người dùng tạo). Bạn có thể thêm cơ sở dữ liệu "chính" có chứa tra cứu, trên cơ sở dữ liệu / máy chủ nào mà các cuộc hội thoại đơn lẻ có thể được tìm thấy (hoặc bạn có một lược đồ để gán một cơ sở dữ liệu từ băm / modulo hoặc thứ gì đó).

Có thể bạn có thể tìm thấy các kiến ​​trúc trong thế giới thực giải quyết các vấn đề tương tự (bạn có thể không phải là người đầu tiên) và đã được giải quyết.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.