2011-11-12 35 views
14

Tôi đang cố gắng xây dựng hệ thống nhắn tin/trò chuyện. có thể lưu trữ cuộc hội thoại giữa hai người theo thứ tự thời gian. Ngoài ra nếu Người dùng A xóa cuộc trò chuyện, Người dùng B vẫn có quyền truy cập vào cuộc trò chuyện cho đến khi anh ta muốn xóa họ.Thiết kế cơ sở dữ liệu để lưu trữ Tin nhắn trò chuyện giữa mọi người

  1. Hộp thư đến - Tất cả thư được người dùng khác nhận sẽ được hiển thị với thông điệp mới nhất từ ​​chuỗi cụ thể đó.

  2. thoại màn hình - thứ tự thời gian của cuộc nói chuyện giữa người dùng A và User B

Đây là cấu trúc cơ bản của cơ sở dữ liệu tôi đã đưa ra. Tôi có nên lưu trữ các thông điệp hai lần trong cơ sở dữ liệu?

  1. id
  2. to_id
  3. from_id
  4. nhắn
  5. timestamp
  6. đọc
+0

tôi không hiểu tại sao mọi người bỏ phiếu xuống cho câu hỏi của tôi :( –

Trả lời

7

Tôi sẽ sử dụng một bảng tra cứu cho các thông điệp mà sẽ lưu trữ những người có quyền để xem thông điệp

table->message     | table->messageUsers 
id->0, message->'hi', user_id->1  user_id->1, message_id->0 
             user_id->2, message_id->0 

cách đó, nếu người dùng xóa thông điệp của họ họ đang thực sự chỉ xóa mối quan hệ của họ để được thông báo không bản thân thông điệp. bạn chỉ cần xóa chúng khỏi bảng người dùng tin nhắn. hoặc đặt trường hiện hoạt thành 1 hoặc 0.

+0

nếu tôi xóa cho phép nói 1 tin nhắn của người dùng. làm cách nào người dùng 2 biết thông báo là từ người dùng 1 chứ không phải từ người dùng 3 hoặc 4? –

+0

tôi đã cập nhật câu trả lời. Vì vậy, bạn sẽ chỉ lưu trữ trong bảng thông báo rằng 'user_id' là id của người dùng đã tạo thông báo. ví dụ: nếu message-> user_id = 1 và trong messageUsers bạn xóa khả năng đọc thư của người dùng 1, người dùng 2 sẽ vẫn thấy thông báo và người tạo thư đó. –

+0

Điều này cũng giả định rằng bạn đang tạo ra một cơ sở dữ liệu quan hệ ... hy vọng bạn đang có. –

1

Sẽ có hai bảng. nút node_user

Trong bảng nút,

  • node_id
  • tiêu đề
  • nhắn
  • timestamp

Trong bảng node_user,

  • node_user_id (PK)
  • node_id
  • parent_node_id (đối với ren)
  • from_id
  • to_id
  • timestamp
  • đọc

Khi người dùng A gửi một thông điệp tới người sử dụng B trước tiên lưu trữ thư trong bảng nút. Và sau đó, thêm hai bản ghi trong bảng node_user. Khi người dùng xóa thư, chỉ xóa bản ghi đầu tiên trong bảng node_user. Khi người dùng B xóa thư, bạn có thể xóa bản ghi từ cả hai nút và bảng node_user.

Threaded nhắn,

  • Sử dụng parent_node_id
+0

tại sao tôi cần lưu trữ thư ba lần? –

+0

xin lỗi. Tôi quên xóa cột thư trong bảng node_user Tôi sẽ chỉnh sửa Bạn không cần lưu trữ tin nhắn ba lần, chỉ cần một lần trong bảng nút, sử dụng bảng node_user để lưu trữ người gửi và người nhận.Nó cũng sẽ hoạt động nếu bạn thêm các tính năng CC và BCC sau đó –

+0

tôi đã sửa đổi câu hỏi của mình ... để nói rõ nhu cầu của tôi, hãy gọi một hộp thư đến không phù hợp. Cảm ơn rất nhiều –

1

Lúc đầu, tôi nghĩ rằng khi một người đã xóa nó, bạn chỉ có thể biến một trong hai đến hoặc từ để null nhưng điều đó sẽ làm cho bạn mất ai đã gửi tin nhắn hoặc người mà nó đã được giải quyết.

Bạn chỉ cần thêm trường deleted_by sẽ chứa id của người đã xóa hoặc sẽ bị vô hiệu. Vì vậy, khi lựa chọn các bản ghi từ các hộp thư bạn có cái gì đó như:

Chọn * Từ Messages nơi to_id = myid và deleted_by <> myid

khi bạn xóa tin nhắn bạn kiểm tra xem deleted_by là null, nếu nó là bạn cập nhật trường deleted_by với MyID, nếu nó không phải là (có nghĩa là bên kia đã xóa nó), bạn xóa bản ghi.

Nếu bạn muốn có cùng chức năng cho chủ đề thay vì tin nhắn (tức là quản lý cuộc hội thoại và không phải một tin nhắn cùng một lúc), bạn nên có một bảng khác (MessageThreads) trong đó bạn có các trường from_id, to_id, deleted_by cùng với trường thread_id. trong bảng Thông báo, bạn đặt from_id to_id và deleted_by với thread_id.

Các vấn đề liên quan