나는 SE와 다른 곳에서 통지 시스템을 구축하는 방법으로 찾고있다 자신은 여기 허용 대답을 수있는 솔루션을 그려 발견 : /programming/9735578/building-a-notification-system 하는 용도 이 구조 :
╔═════════════╗ ╔═══════════════════╗ ╔════════════════════╗
║notification ║ ║notification_object║ ║notification_change ║
╟─────────────╢ ╟───────────────────╢ ╟────────────────────╢
║ID ║—1:n—→║ID ║—1:n—→║ID ║
║userID ║ ║notificationID ║ ║notificationObjectID║
╚═════════════╝ ║object ║ ║verb ║
╚═══════════════════╝ ║actor ║
╚════════════════════╝
누군가 (행위자)가 변경하고 (동사 = 추가, 요청한 ..) 무언가 (객체 = 이벤트, 우정 ..)에 대한 알림은 사용자 (제목)에게보고됩니다. 다음은 표준화 된 데이터 구조입니다 (MongoDB를 사용했지만). 특정 사용자에게 변경 사항을 알려야합니다. 따라서 사용자 별 알림입니다. 100 명의 사용자가 참여한 경우 100 개의 알림을 생성합니다.
처음에는이 방법을 이해했다고 생각했지만 구현할 준비가되었을 때 특히 잘 이해하지 못했음을 깨달았습니다. 답변에 대한 마지막 몇 가지 의견은 솔루션을 이해하는 데 어려움이있는 다른 사용자의 질문입니다.
이것이 내가 따르는 모델인지 확실하지 않지만, 그것이 가지고있는 투표의 수를 감안할 때, 그것을 이해 하면 도움이 될 것이라고 확신 하며, 더 자세히 배우고 싶습니다. 이 솔루션을 이해하는 데 어려움을 겪은 다른 사람들에게도 유용하게 사용되기를 바랍니다 (실수 로이 질문을 지시하는 답변에 대한 의견을 남길 인터넷 포인트가 충분하지 않습니다. 누구든지하십시오!)
질문
올바르게 이해하면 notificationObjectID 는 notification_object 테이블을 가리키는 외래 키 이고 notificationID 는 알림 테이블을 가리키는 외래 키 입니다. 것 같다 객체 알림 (예 : 특정 이벤트 또는 포스트)에 관한 데이터베이스 항목의 ID를 참조 외래 키해야하지만, 우리는 다음 다른 필드 ID가 속해있는 테이블을 표시하기 위해 필요하지 않습니다?
저자는 썼다
notification_object.object는 문자열 "friendship"과 같은 변경 유형을 식별합니다. 내가 말한 추가 데이터가있는 변경된 오브젝트에 대한 실제 참조는 notification_change.notificationObjectID에 있습니다.
그것은 나에게 이해가되지 않는 것 같습니다. 객체는 문자열 (enum?)이고 notificationObjectID는 알림이 관련된 객체를 나타내는 외래 키입니까? 그렇다면 가운데 테이블과 오른쪽 테이블은 어떻게 연결되어 있습니까?
가운데 테이블은 알림이 어떤 객체 (또는 객체 유형) (예 : 이벤트 또는 게시물)인지 지정합니다. 그런 다음 notification_change 에 동일한 객체 유형을 가리키는 많은 항목을 가질 수 있으므로 알림 을 번들로 묶을 수 있습니다 (예 : "X의 벽에 게시 된 25 명의 사용자). 따라서 중간 테이블과 오른쪽 테이블 간의 1 : n 관계입니다.
그러나 왜 왼쪽 테이블과 중간 테이블 사이에 1 : n 관계가 있습니까? "샘의 벽에 게시 된 25 명의 사용자"와 "메리가"금요일 피크닉 "이벤트에 동일한 알림 ID를 제공합니까? 동일한 사용자에 대한 모든 알림에 동일한 알림 ID가있는 이유는 무엇입니까? 왼쪽?
성능 질문-John이 Mary의 피크닉 이벤트에 대한 의견을 게시한다고 말합니다. notification_change 항목을 만들기 전에 Mary 's Picnic에 대한 notification_object가 이미 있는지 확인하기 위해 조회를 수행해야 할 것 같습니다 . 이것이 성능에 부정적인 영향을 미치거나 문제가 아닌가? 우리가 알고 얼마나, 이전 단락에서 질문을 계속 통지 지점 항목 notification_object을 에?