Codeigniter: как отслеживать активность без использования нескольких строк БД? - PullRequest
1 голос
/ 07 мая 2010

Мне нужно отслеживать выполнение задач для пользователей.

Я начал с того, что у меня была строка с именем "first_login", "profile_complete", "other_thing_complete" и т. Д. *

IЯ хотел бы объединить их все в одну строку "activity_state".

Я просто не знаю, как правильно хранить данные в этом поле и как их получить.

Что заполе должно быть, и как мне читать / писать в него?

Ответы [ 4 ]

3 голосов
/ 07 мая 2010

Я не уверен, что полностью понимаю требования - и я уверен, что у других здесь будет лучший ответ ... но вот мой путь

Я полагаю, у вас уже есть таблица пользователей.

Что, если вы добавили таблицу действий и таблицу users_activities.

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

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

Поэтому, когда пользователь завершает действие, вы просто добавляете запись в таблицу users_activities.

2 голосов
/ 07 мая 2010

Если у вас есть только небольшое количество «действий», которые вы хотите отслеживать, вы можете иметь таблицу со столбцом 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
1 голос
/ 08 мая 2010

Никогда не храните сериализованные объекты, доступ к ним медленный (поиск, десериализация), а поиск еще сложнее.

Если это сравнительно небольшое количество задач и они логические, вы можете хранить их как битовые маски (это может быть неправильный термин).

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)

Как вы можете видеть, только первые два запроса вернули ненулевое значение, что означает, что если вы ищете записи, где поле anded с 8 не равно нулю, вы получите все записи, где other_thing2_complete завершено и т. д. Чтобы установить для other_thing2_complete значение true, просто добавьте 8. Для установки значения false для other_thing2_complete просто вычтите 8.

Никогда не делал этого сам, поэтому вы можете столкнуться с проблемами, которые я не предвидел. Но если все действия, которые вы отслеживаете, являются логическими, то это должно сработать и позволить лучший поиск / обновление.

0 голосов
/ 08 мая 2010

Вы, кажется, не понимаете значение слова "строка". Похоже, что вы сначала создали таблицу со столбцами «first_login», «profile_complete», «other_thing_complete» и т. Д. У каждого пользователя будет собственная строка в этой таблице с указанными вами столбцами.

Похоже, вы решили, что хотите сохранить все эти элементы данных в одном столбце с именем «activity_state», предположительно потому, что поняли, что вам придется обновлять таблицу каждый раз, когда вы определили новую задачу, которую хотели отслеживать.

Если вы собираетесь это сделать - храните все свои элементы данных в одном столбце - вы должны хранить его как сериализованный объект.

Тем не менее, метод, предложенный somebodyinomaha, является лучшим способом сделать это. Это полностью расширяемый. Вам не нужно беспокоиться о разборе поля. Самое главное, что с вашим методом вам придется выполнять полное сканирование таблицы каждый раз, когда вы ищете в таблице любое из отслеживаемых значений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...