2013-02-12 4 views
0

현재 활동 유형에 따라 다른 테이블을 참조하는 단일 활동 테이블이 있습니다.MySQL에서 사용자 활동 테이블을 구성하는 방법은 무엇입니까?

id | type | user_id | source_id | misc_id | date 

유형의 열은 소스 ID가 행동의 유형으로 테이블 ID 상대가 들어 사용자가 수행 한 활동의 ​​종류 (다음, 상태 등 친구가 좋아) 저를 알려줍니다.

이것은 사용자 활동 스트림에 대해서는 잘 작동하지만 유일한 문제는 관련 테이블에 더 이상 존재하지 않는 행에 대해 수행 할 작업을 파악할 수 없다는 것입니다.

예. 사용자는 상태를 작성한 다음 삭제하거나 사용자가 나중에 데이터베이스에서 삭제 된 누군가와 친구가됩니다.

활동이 단일 유형에 비례하는 경우, 행을 제거하는 외래 키 제약 조건을 추가 할 수 있습니다. 하지만 다른 테이블과 관련이 있기 때문에 어떻게해야할까요?

+0

이로 인해 어떤 문제가 발생합니까? – Bulat

+0

다른 테이블에 더 이상 존재하지 않는 결과를 반환하기 때문입니다. ... ... 또는 샘이 좋아하는 샘과 친구가되었다 을 : 내가 활동의 유형에 switch 문을 실행하고있어 행이 존재하지 않을 경우이 같은 출력을 얻을 것이다 점이 빈 공간. –

+0

음, 날짜 유형의'Reversed' 필드를 추가하고 필터하십시오. SQL을 표시하면 솔루션을 찾는 것이 더 쉬울 것입니다. – Bulat

답변

1

내 생각은 다음과 같습니다.

사용자가 무언가를 삭제할 수 있으면 활동 표에도 기록 할 수 있습니다.

해당 활동을 숨기려면 ReversedOn 필드를 추가하고 관련 날짜로 업데이트하십시오. 그러면 존재하지 않는 활동을 걸러 내기 만하면됩니다.

그렇다고 사용자 경험에 문제가 발생하지 않는다면 문제가 될 수 있습니다.

1

이러한 방법 중 하나를 선택해야합니다.

  1. 사용자가 삭제할 때 테이블에서 하드 삭제하는 대신 삭제 된 것으로 표시하여 백엔드에서 소프트 삭제를 수행하면됩니다. 이 접근법에서 새로운 열 "delete_flag"를 도입해야합니다.

  2. 테이블을 아카이브하고 삭제할 때 레코드를 다른 테이블로 이동하십시오. 그러나 이것은 복잡한 코딩이 현명 할뿐만 아니라 성능이 예상대로되지 않을 수도 있습니다.

+0

답장을 보내 주셔서 감사합니다. 행이 더 이상 필요 없기 때문에 행 자체를 삭제하는 대신 행에 삭제 플래그를 추가하면 어떤 차이가 있습니다. 또한 사용자가 제어 할 수없는 다른 것들은 어떻습니까? 사용자가 사이트에 뉴스 및 프로필 페이지를 추가 할 때를위한 활동이 있지만 관리자 섹션 대신 phpmyadmin에서 곧바로 뉴스를 삭제합니다. –

+0

삭제 플래그를 사용할 때 외래 키 제약 조건을 사용할 수 있습니다. 비즈니스 논리에서 처리해야합니다. admin 활동을 가져올 때마다 delete_flag가 false 여야한다는 제약 조건을 적용해야합니다.그래도 데이터를 보존하여 어딘가에서 사용하게하려는 경우 적용 할 수 있습니다. 이 레코드와이 레코드를 참조하는 다른 레코드가 더 이상 필요하지 않다고 생각하면 모든 레코드를 삭제할 수 있습니다. – Slowcoder

관련 문제