다음 상황에 대한 일반적인 데이터베이스 구조가 있는지 궁금합니다.사용자가 마지막으로 본 이후에 변경된 배지/표시 내용
내 웹 앱에는 사용자와 프로젝트가 있습니다. 이제
프로젝트가 생성되거나 수정 될 때마다, 보지 모든 사용자가 새/수정 프로젝트는 아직 어떤 방법으로 통지 할 필요가 있음 (예를 들어 프로젝트 제목이나 뭔가 앞에 아이콘)
이것에 대한 일반적인 방법이 있습니까? 그렇다면 방법은 무엇이며 가장 효율적인 방법은 무엇입니까?
다음 상황에 대한 일반적인 데이터베이스 구조가 있는지 궁금합니다.사용자가 마지막으로 본 이후에 변경된 배지/표시 내용
내 웹 앱에는 사용자와 프로젝트가 있습니다. 이제
프로젝트가 생성되거나 수정 될 때마다, 보지 모든 사용자가 새/수정 프로젝트는 아직 어떤 방법으로 통지 할 필요가 있음 (예를 들어 프로젝트 제목이나 뭔가 앞에 아이콘)
이것에 대한 일반적인 방법이 있습니까? 그렇다면 방법은 무엇이며 가장 효율적인 방법은 무엇입니까?
"사용자가 어떤 프로젝트를 보았는가"에 대한 많은 관계가 있습니다. 사용자 테이블에 외래 키가 있고 프로젝트 테이블에 외래 키가 정확하게 두 개의 열이있는 테이블로 가장 잘 구현되었습니다. 프로젝트가 생성되면 아직이 테이블에 항목을 추가하지 않습니다 (특정 사용자를 프로젝트를 본 것으로 간주되는 작성자로 식별 할 수없는 경우 해당 항목을 추가하는 경우) - 항목을 추가 할 경우 (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가 실제로 그것을 본 것으로 간주되는 경우 delete
의 where
절에 and uid!=U
을 추가 할 수 있습니다. 두 번 이상 "볼"조건이 더 기록하는 무해한 있도록
는 U 지금 프로젝트 P 보았다 특정 사용자가 insert ignore into Seen(uid, pid) values (U, P)
합니다 (ignore
부분은 "행이 이미 있다면 아무것도하지"를 의미한다는 사실을 표시하려면 물론 중복 됨).
내가 할 일은 일종의 "알림"엔티티 (테이블)를 만드는 것입니다. 그런 다음 누군가가 새 프로젝트를 추가 할 때 데이터베이스 - 클라이언트 코드가 새로운 알림을 삽입하도록 할 수 있습니다. 또는 데이터베이스 자체에 triggers을 사용하여 자동으로 수행 할 수도 있습니다.
알림 (테이블과 어떤 속성이 필요한지)은 응용 프로그램의 디자인에 달려 있습니다.
는 아마도
users_viewed_projects +--------+-----------+ + userId | projectId |
같은 것이 사용자 ID에 대해이 테이블에 항목을 추가/그 해당 사용자에 의해 확인되었습니다 projectId 번.
각 사용자가 각 프로젝트를 마지막으로 본 시간 (있는 경우)을 보여주는 테이블이 필요합니다. 각 프로젝트에 대한
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
처럼, 현재 사용자의 오른쪽 외부 조인 수행 할 수 있습니다
프로젝트 테이블에 버전 열을 추가하려고합니다. 그런 다음 사용자가 액세스 할 수있는 프로젝트를 참조 할 때마다 사용자가 사용한 프로젝트의 마지막 버전을 표시하는 열을 추가합니다.
이제 사용자 및 프로젝트에 대한 정보를 입력 할 때마다 프로젝트의 현재 버전 번호를 확인할 수 있습니다. 현재 버전 번호가 있으면 프로젝트에 변경 사항이 있음을 알게됩니다.
물론 오버 헤드가 발생합니다. 업데이트를 기록한 프로젝트의 사용자 버전 번호를 업데이트해야하며, 프로젝트가 변경 될 때마다 버전 번호를 늘려야합니다. kigurai에서 언급했듯이 트리거를 사용하여이 중 일부를 자동화 할 수 있습니다.
은 자세한 내용은 –
덕분에 나쁜 일이 될 수 없다! SQL은 좋을 것이지만 나는 그것을 처리 할 수 있다고 생각한다. – Bundy