2013-01-24 1 views
0

데이터베이스에 대한 체크 박스 목록의 변경 사항을 저장하는 최선의 방법을 찾고 있습니다. 같은 좀 데이터베이스 항목을 기반으로 중 선택 또는 선택 해제하는 체크 박스의 목록을DB에 대한 체크 박스 저장 변경

: 여기 내 설정이다

Animals I like: 
0 Cats 
X Dogs 
0 Birds 
X Elefants 

이제 사용자는 완전히 그/그녀의 마음을 변경하고 선택할 수 있습니다 Birds을 선택하고 Dogs을 선택 취소하고이 변경 사항을 가능한 한 효율적으로 데이터베이스에 저장하려고합니다.

db가 구조화 된 방식으로 user_id가있는 user 테이블과 animal_id가있는 animal 테이블이 있습니다. "likes"는 피봇 테이블에서 추적됩니다 (다 대다 관계이기 때문에). 여기

내가 생각 한 몇 가지 방법,하지만 난 다른/더/더 효율적 것들에 관심이 :

1) 저장에이 사용자에 대한 피벗 테이블의 모든 항목을 삭제 만 입력 확인 된 것들.

이렇게하면 앞/뒤 옵션을 많이 비교할 필요가 없다는 장점이 있습니다. 단점은 변경되지 않은 항목을 삭제한다는 것입니다 (위의 예에서 elefants). 만약 내가 elefant와 같은 생성 타임 스탬프를 첨부하면, 그 선택을 변경하지 않아도 매번 변경 될 것입니다.

2) 저장시, db에 쿼리하여 모든 원본 좋아하는 것의 목록을 얻습니다. 나는이 목록을 새로운 사람들에게 새로운 것과 비교한다. 새 목록에없는 것과 같은 원본을 만날 때마다 제거합니다. 원래 목록에없는 것과 같은 새로운 것을 발견하면 추가합니다.

이것은 데이터베이스의 변경 사항 만 변경하는 장점이 있지만 엄청난 양의 쿼리처럼 보입니다. 동물 목록이 길고 많은 변경이 이루어지면 루핑으로 인해 많은 db 거래가 발생할 수 있습니다.

이 문제를 해결하는 가장 좋은 방법은 무엇입니까? 제 말은 공통적 인 문제 여야하며 여기서 바퀴를 재발견하고 싶지는 않습니다.

+0

나는 Elefants * (무엇인지 :-)). 접근법 1에 찬성표를 던졌습니다. –

답변

1

옵션 1이 가장 좋지만 타임 스탬프가 방해 받기를 원하지 않으므로 "각 레코드를 개별적으로 확인"하는 것보다 다소 효율적인 시스템을 수행 할 수 있습니다.

1) db, $ original에서 사용자의 선택 목록을 가져옵니다.

2) 제출 된 양식 $ 목록에서 선택 목록을 가져옵니다.

3)의 변경 알아낼 array_diff()를 사용하면 데이터베이스에 무엇을해야

예를 들어,

$original = array(2,4,6,8); 
$submitted = array(4,7,8); 
// so 2 and 6 have been removed, and 7's been added. 

$unchanged = array_intersect($original, $submitted); // 4, 8 
$removed = array_diff($original, $submitted); // 2, 6 
$added = array_diff($submitted, $original); // 7 

$sql = "DELETE FROM pivot_table WHERE animal_id IN (2, 6);"; // remove 2&6 
$sql = "INSERT INTO (animal_id, ...) VALUES (7, ...)"; // insert 7 
+0

아, 그게 정확히 제가 필요로하는 것입니다. 단지 양방향으로 사용되는'array_diff'를 생각 해보지 않았습니다. 정말 고마워. – Steve

0

원래 사용자에게 선택 사항을 제시하면 이미 확인한 내용을 표시하기 위해 데이터베이스 쿼리를 완료했습니다. 이제 변경 사항을 원본과 비교할 수 있습니다. 무언가가 바뀌면 업데이트하십시오. 그렇지 않으면 그대로 두십시오.