2010-05-07 4 views
1

사용자의 작업 완료를 추적해야합니다. Codeigniter : 여러 개의 db 행을 사용하여 활성을 추적하는 방법은 무엇입니까?

나는 "first_login", "profile_complete", "other_thing_complete"등이라고하는 행 ... 나는 모든 하나의 행 "activity_state"로 이들을 결합하고 싶습니다

을함으로써 시작했다.

이 필드에 데이터를 올바르게 저장하는 방법과 검색하는 방법을 모르겠습니다.

필자는 어떤 필드가 있어야하며 어떻게 읽고 쓸 수 있습니까?

답변

3

나는 요구 사항을 완전히 이해하고 있는지 잘 모르겠다. 여기에있는 다른 사람들이 더 좋은 대답을 할 것이라고 확신한다. 그러나 여기에 내 것이다.

이미 사용자 테이블이 있다고 가정합니다.

활동 테이블과 users_activities 테이블을 추가하면 어떻습니까?

activity 
------------- 
id 
name 

users_activities 
------------------ 
id 
activity_id 
user_id 

그래서 사용자가 작업을 완료 할 때마다, 당신은 단지 users_activities 테이블에 레코드를 추가합니다.

+0

이렇게하면 한 행을 사용하는 목적을 무효화 할 수 있습니다. :) –

+0

아 ... 내 잘못이야. 하나의 행으로 제한하는 이유는 무엇입니까? – someoneinomaha

+0

하나의 값을 반환하여 많은 액티비티에 대해이 작업을 수행 할 수 있다는 것은 멋지다고 생각했습니다. –

2

추적하려는 활동의 수가 적은 경우 추적하려는 각 활동에 대해 BOOL 열이있는 표가있을 수 있습니다.

activity 
-------- 
INT user_id 
BOOL first_login (default 0) 
BOOL profile_complete (default 0) 
BOOL other_thing_complete (default 0) 

은 당신의 기존 사용자 테이블의 일부가 될 수 있습니다. 각 열의 기본값은 0/false입니다. 활동이 발생하면 사실로 업데이트됩니다. 예 :

UPDATE activity SET first_login = 1 WHERE user_id = 23 
+0

이 항목을 한 행에 저장하려면 어떻게해야합니까? "first_login", 10의 장소 "profile_complete"등으로 자신의 위치를 ​​사용할 수 있습니까? –

+0

위의 표는 4 개의 열입니다. 한 명의 사용자가 하나의 행으로 표시됩니다. – Dolph

0

"행"의 의미에 대해 혼란스러워합니다. 먼저 "first_login", "profile_complete", "other_thing_complete"등의 열이있는 테이블을 만든 것 같습니다. 각 사용자는 지정한 열을 사용하여 해당 테이블에 자신의 행을 갖게됩니다.

그런 다음 모든 데이터 요소를 "activity_state"라는 단일 열에 저장하려고한다고 판단한 것 같습니다. 아마도 당신이 새로운 작업을 식별 할 때마다 테이블을 업데이트해야한다는 것을 깨달았 기 때문일 것입니다 추적하고 싶었다.

모든 데이터 요소를 하나의 열에 저장하려면 이것을 serialized 개체로 저장해야합니다.

그렇다면 누군가 만하라가 제안한 방법이 최선의 방법이라고합니다. 그것은 완전히 확장 가능합니다. 필드 구문 분석에 대해 걱정할 필요가 없습니다. 가장 중요한 점은 추적하는 값에 대해 테이블을 검색 할 때마다 전체 테이블 검색을 수행해야한다는 것입니다.

+0

죄송합니다. 행/열에 대해 섞여서 표시되었습니다! 따라서 모든 "activity_state"를 하나의 직렬화 된 열에 저장하는 것은 매우 나쁜 생각 일 것이라고 말하는 것입니까? –

+0

이 경우 예. 그리고 대부분의 경우 직렬화가 좋지 않습니다. 그러나 조회수/방문수 사이에 사용자 세션을 저장하는 것과 같이 선택의 여지가없는 상황이 있습니다. 또한 dolph 및 Sid에서 설명한 부울 메서드를 사용하면 새 작업을 추적 할 때마다 테이블 정의를 업데이트해야합니다. 이것은 충분히 큰 테이블이 주어지면 본질적으로 시스템을 중단시킬 수 있습니다. – coolgeek

1

직렬화 된 객체를 저장하지 마십시오. 액세스 속도가 느리고 (검색, 직렬화 해제) 검색이 더 어렵습니다.

상대적으로 적은 수의 작업이고 부울 경우 비트 마스크 (잘못된 용어 일 수 있음)로 저장할 수 있습니다.

1 = first_login 
2 = profile_complete 
4 = other_thing_complete 
8 = other_thing2_complete 
16 = other_thing3_complete 
... 

값 10은 profile_complete + other_thing2_complete를 의미합니다. http://dev.mysql.com/doc/refman/5.0/en/bit-functions.html을 보거나 검색하십시오. 당신이 볼 수 있듯이

mysql> select 10&2; 
+------+ 
| 10&2 | 
+------+ 
| 2 | 
+------+ 
1 row in set (0.00 sec) 

mysql> select 10&8; 
+------+ 
| 10&8 | 
+------+ 
| 8 | 
+------+ 
1 row in set (0.01 sec) 

mysql> select 10&1; 
+------+ 
| 10&1 | 
+------+ 
| 0 | 
+------+ 
1 row in set (0.00 sec) 

mysql> select 10&4; 
+------+ 
| 10&4 | 
+------+ 
| 0 | 
+------+ 
1 row in set (0.00 sec) 

mysql> select 10&16; 
+-------+ 
| 10&16 | 
+-------+ 
|  0 | 
+-------+ 
1 row in set (0.00 sec) 

첫 번째 두 쿼리는 필드 가 8가 AND로 기록을 검색하는 경우 즉, 영이 아닌 값을 반환 other_thing2_complete이 완료 위치를 모든 레코드를 얻을 비 - 제로 other_thing2_complete를 true로 설정하려면 단순히 8을 추가하면됩니다. other_thing2_complete를 false로 설정하려면 간단히 8을 빼십시오.

예견하지 않으므로 내가 예상하지 못한 문제가 발생할 수 있습니다. 그러나 추적하고있는 모든 활동이 부울 값이라면 트릭을 수행하고 최상의 검색/업데이트가 가능해야합니다.

+0

이것은 단순히 완료된 작업을위한 몇 가지 추가 필드가있는 것보다 더 많은 문제가있는 것 같습니다. –

+0

더 많은 필드 (프로젝트와 관련된 모든 CMS 또는 가져 오기 유틸리티에 영향을 미칠 수 있음)를 추가하지 않고 시간이 지나면 쉽게 확장 할 수 있습니다. . 나중에 새 작업의 상태를 유지해야하는 경우 32를 해당 필드로 지정하십시오 (위의 예에서 사용한 가장 높은 값은 16 임). 그렇습니다. Dolph Mathews의 답변을 보려면 더 많은 필드가 적절한 방법입니다. – Sid

관련 문제