Database Codeigniter:如何使用多个db行跟踪不活动?
我需要跟踪用户任务的完成情况 我从一个名为“first_login”、“profile_complete”、“other_thing_complete”的行开始 我想把这些都合并成一行“活动状态” 我只是不知道如何在这个字段中正确地存储数据,以及如何检索数据Database Codeigniter:如何使用多个db行跟踪不活动?,database,codeigniter,state,Database,Codeigniter,State,我需要跟踪用户任务的完成情况 我从一个名为“first_login”、“profile_complete”、“other_thing_complete”的行开始 我想把这些都合并成一行“活动状态” 我只是不知道如何在这个字段中正确地存储数据,以及如何检索数据 它应该是什么类型的字段,我应该如何读/写它?我不确定我是否完全理解这些要求-我相信这里的其他人会有更好的答案。。。但这是我的计划 我假设您已经有了一个users表 如果您添加了一个活动表和一个用户活动表会怎么样 activity -----
它应该是什么类型的字段,我应该如何读/写它?我不确定我是否完全理解这些要求-我相信这里的其他人会有更好的答案。。。但这是我的计划 我假设您已经有了一个users表 如果您添加了一个活动表和一个用户活动表会怎么样
activity
-------------
id
name
users_activities
------------------
id
activity_id
user_id
因此,每当用户完成一项活动时,只需向users\u activities表中添加一条记录 我不确定我是否完全理解这些要求,我相信这里的其他人会有更好的答案。。。但这是我的计划
activity
-------------
id
name
users_activities
------------------
id
activity_id
user_id
我假设您已经有了一个users表
如果您添加了一个活动表和一个用户活动表会怎么样
activity
-------------
id
name
users_activities
------------------
id
activity_id
user_id
因此,每当用户完成一项活动时,只需向users\u activities表中添加一条记录 如果您只想跟踪少量“活动”,则可以为每个要跟踪的活动创建一个带有BOOL列的表
activity
-------------
id
name
users_activities
------------------
id
activity_id
user_id
activity
--------
INT user_id
BOOL first_login (default 0)
BOOL profile_complete (default 0)
BOOL other_thing_complete (default 0)
这甚至可以是现有用户表的一部分。每列将默认为0/false;当某个活动发生时,只需将其更新为true即可。例如:
UPDATE activity SET first_login = 1 WHERE user_id = 23
如果您只想跟踪少量的“活动”,那么可以为每个要跟踪的活动创建一个带有BOOL列的表
activity
--------
INT user_id
BOOL first_login (default 0)
BOOL profile_complete (default 0)
BOOL other_thing_complete (default 0)
这甚至可以是现有用户表的一部分。每列将默认为0/false;当某个活动发生时,只需将其更新为true即可。例如:
UPDATE activity SET first_login = 1 WHERE user_id = 23
你似乎对“行”的意思感到困惑。似乎您首先创建了一个包含列“first_login”、“profile_complete”、“other_thing_complete”等的表。每个用户在该表中都有自己的行,以及您指定的列 然后,您似乎已经确定要将所有这些数据元素存储在一个名为“activity_state”的列中,这大概是因为您意识到,在每次确定要跟踪的新任务时,都必须更新表
activity
--------
INT user_id
BOOL first_login (default 0)
BOOL profile_complete (default 0)
BOOL other_thing_complete (default 0)
如果要执行此操作(将所有数据元素存储在一列中),则应将其存储为对象
也就是说,Inomaha建议的方法是最好的方法。它是完全可扩展的。您不必担心解析字段。最重要的是,使用您的方法,当您在表中搜索要跟踪的任何值时,都必须执行完整的表扫描。您似乎对“行”的含义感到困惑。似乎您首先创建了一个包含列“first_login”、“profile_complete”、“other_thing_complete”等的表。每个用户在该表中都有自己的行,以及您指定的列 然后,您似乎已经确定要将所有这些数据元素存储在一个名为“activity_state”的列中,这大概是因为您意识到,在每次确定要跟踪的新任务时,都必须更新表
activity
--------
INT user_id
BOOL first_login (default 0)
BOOL profile_complete (default 0)
BOOL other_thing_complete (default 0)
如果要执行此操作(将所有数据元素存储在一列中),则应将其存储为对象
也就是说,Inomaha建议的方法是最好的方法。它是完全可扩展的。您不必担心解析字段。最重要的是,使用您的方法,当您在表中搜索要跟踪的任何值时,都必须执行完整的表扫描。永远不要存储序列化对象,访问它们的速度很慢(检索、非序列化),搜索更加困难 如果任务数量相对较少,并且它们是布尔型的,那么可以将它们存储为位掩码(这可能是错误的术语) 那么,值10表示profile_complete+其他东西2_complete。 查看或搜索这些
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)
正如您所看到的,只有前两个查询返回了非零值,这意味着如果您搜索字段AND和8为非零值的记录,您将获得其他内容2完成的所有记录等。要将其他内容2完成设置为true,只需添加8即可。要将其他内容2设置为false,只需减去8即可
我自己从来没有这样做过,所以你可能会遇到我没有预料到的问题。但是,如果您跟踪的所有活动都是布尔型的,那么这应该可以实现最佳搜索/更新。永远不要存储序列化对象,访问它们的速度很慢(检索、非序列化),搜索更困难 如果任务数量相对较少,并且它们是布尔型的,那么可以将它们存储为位掩码(这可能是错误的术语) 那么,值10表示profile_complete+其他东西2_complete。 查看或搜索这些
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)
正如您所看到的,只有前两个查询返回了非零值,这意味着如果您搜索字段AND和8为非零值的记录,您将获得其他内容2完成的所有记录等。要将其他内容2完成设置为true,只需添加8即可。要将其他内容2设置为false,只需减去8即可
我自己从来没有这样做过,所以你可能会遇到我没有预料到的问题。但是,如果您跟踪的所有活动都是布尔值,那么这应该可以实现最佳搜索/更新。这将破坏使用一行的目的。:)啊。。。我的错。将其限制为一行的原因是什么?我只是认为能够通过返回一个值来为一系列活动执行此操作会很酷…这会破坏使用一行的目的。:)啊。。。我的错。把它限制在一排的原因是什么?我只是觉得能在一堆活动中这样做会很酷