2009-12-05 4 views
3

다음 상황에 대한 일반적인 데이터베이스 구조가 있는지 궁금합니다.사용자가 마지막으로 본 이후에 변경된 배지/표시 내용

내 웹 앱에는 사용자와 프로젝트가 있습니다. 이제

프로젝트가 생성되거나 수정 될 때마다, 보지 모든 사용자가 새/수정 프로젝트는 아직 어떤 방법으로 통지 할 필요가 있음 (예를 들어 프로젝트 제목이나 뭔가 앞에 아이콘)

이것에 대한 일반적인 방법이 있습니까? 그렇다면 방법은 무엇이며 가장 효율적인 방법은 무엇입니까?

답변

3

"사용자가 어떤 프로젝트를 보았는가"에 대한 많은 관계가 있습니다. 사용자 테이블에 외래 키가 있고 프로젝트 테이블에 외래 키가 정확하게 두 개의 열이있는 테이블로 가장 잘 구현되었습니다. 프로젝트가 생성되면 아직이 테이블에 항목을 추가하지 않습니다 (특정 사용자를 프로젝트를 본 것으로 간주되는 작성자로 식별 할 수없는 경우 해당 항목을 추가하는 경우) - 항목을 추가 할 경우 (U, P)가 "사용자 U가 프로젝트 P를 본"때마다 실행됩니다. 프로젝트가 수정되면 해당 프로젝트와 관련된 테이블의 모든 항목이 제거됩니다 (누가 알고있는 경우 수정을 수행중인 사용자의 항목 만 제외).

이 표의 스키마와 단어로 요약 한 작업에 필요한 SQL이 필요합니까?

편집 : 기존 때

create table Seen (uid int, pid int, 
        foreign key uid references user(uid) on delete cascade, 
        foreign key pid references project(pid) on delete cascade, 
        primary key (uid, pid)) 

: 주석 기 테이블 사용자와 프로젝트가 각각 INT 기본 키 UID와 PID를 가지고 가정, 그래서 (mysql을의 경우, 이노 디비를 가정) SQL을 요청 Pid가 Pid 인 프로젝트가 수정되었으므로 이제는 사용자가 delete from Seen where pid=P을 "본"것으로 간주하지 않습니다 (즉,이 테이블에서 P에 대한 모든 항목을 제거합니다). 사용자 U가 수정했기 때문에 사용자 U가 실제로 그것을 본 것으로 간주되는 경우 deletewhere 절에 and uid!=U을 추가 할 수 있습니다. 두 번 이상 "볼"조건이 더 기록하는 무해한 있도록

는 U 지금 프로젝트 P 보았다 특정 사용자가 insert ignore into Seen(uid, pid) values (U, P)합니다 (ignore 부분은 "행이 이미 있다면 아무것도하지"를 의미한다는 사실을 표시하려면 물론 중복 됨).

+0

은 자세한 내용은 –

+0

덕분에 나쁜 일이 될 수 없다! SQL은 좋을 것이지만 나는 그것을 처리 할 수 ​​있다고 생각한다. – Bundy

0

내가 할 일은 일종의 "알림"엔티티 (테이블)를 만드는 것입니다. 그런 다음 누군가가 새 프로젝트를 추가 할 때 데이터베이스 - 클라이언트 코드가 새로운 알림을 삽입하도록 할 수 있습니다. 또는 데이터베이스 자체에 triggers을 사용하여 자동으로 수행 할 수도 있습니다.

알림 (테이블과 어떤 속성이 필요한지)은 응용 프로그램의 디자인에 달려 있습니다.

0

는 아마도

 
users_viewed_projects 
+--------+-----------+ 
+ userId | projectId | 

같은 것이 사용자 ID에 대해이 테이블에 항목을 추가/그 해당 사용자에 의해 확인되었습니다 projectId 번.

1

각 사용자가 각 프로젝트를 마지막으로 본 시간 (있는 경우)을 보여주는 테이블이 필요합니다. 각 프로젝트에 대한

create table user_seen_project 
(
user_id int, 
project_id int, 
last_seen datetime 
); 

당신은 마지막 변경 시간이 필요합니다.

create table project 
(
    project_id int 
    ... 
    last_changed datetime 
); 

는 그런 다음 결과 집합에서이

select project_id, /* other fields*/ last_changed, last_seen 
from project p outer join user_seen_project up 
on p.project_id=up.project_id 
where up.user_id=$currentUser 

처럼, 현재 사용자의 오른쪽 외부 조인 수행 할 수 있습니다

  • last_seen가 null - 사용자는이 프로젝트를 볼 수 없습니다 (신규 프로젝트)
  • last_seen < last_changed - 업데이트 된 프로젝트
  • last_seen> last_changed - 'old'프로젝트
0

프로젝트 테이블에 버전 열을 추가하려고합니다. 그런 다음 사용자가 액세스 할 수있는 프로젝트를 참조 할 때마다 사용자가 사용한 프로젝트의 마지막 버전을 표시하는 열을 추가합니다.

이제 사용자 및 프로젝트에 대한 정보를 입력 할 때마다 프로젝트의 현재 버전 번호를 확인할 수 있습니다. 현재 버전 번호가 있으면 프로젝트에 변경 사항이 있음을 알게됩니다.

물론 오버 헤드가 발생합니다. 업데이트를 기록한 프로젝트의 사용자 버전 번호를 업데이트해야하며, 프로젝트가 변경 될 때마다 버전 번호를 늘려야합니다. kigurai에서 언급했듯이 트리거를 사용하여이 중 일부를 자동화 할 수 있습니다.

1

희망 사항입니다.

userproject_model_01

내가 가서 말을
+0

thanks! 훌륭한 게시물! – Bundy

관련 문제