Codeigniter会话表结构

时间:2014-04-25 14:48:18

标签: php mysql codeigniter primary-key

我想了解为什么CI会话表结构包含以下三个主键: session_id ip_address 和< EM> user_agent

CREATE TABLE IF NOT EXISTS  `ci_sessions` (
        session_id varchar(40) DEFAULT '0' NOT NULL,
        ip_address varchar(45) DEFAULT '0' NOT NULL,
        user_agent varchar(120) NOT NULL,
        last_activity int(10) unsigned DEFAULT 0 NOT NULL,
        user_data text NOT NULL,
        PRIMARY KEY (session_id, ip_address, user_agent),
        KEY `last_activity_idx` (`last_activity`)
);

请尽可能解释,我也想听听改善这种结构的建议。为什么ip_addressuser_agent为primary_keys,而不仅仅是索引?有什么区别?

另一个信息是,这个表为每个用户的系统访问添加了一行,因此,它非常臃肿。

编辑:想到的另一个问题。我为什么要关心用户代理匹配?

2 个答案:

答案 0 :(得分:2)

这里的想法是每个会话都是独一无二的。它如何识别会话?通过主键中的三个值:session_idip_addressuser_agent

如果你考虑一下,这是有道理的:

  1. 如果session_id发生变化,那么(显然)您正在处理其他(新)会话。
  2. 如果ip_addess发生变化,那么有人会从另一台PC登录 - 这将是一个新会话。
  3. 如果user_agent值发生变化,那么有人会使用其他浏览器 - 再次,这将是一个新会话。
  4. 因此,假设只有session_id是主键:更改ip_addressuser_agent只会更新session_id的现有行。如果是这种情况,只知道session_id将使我能够在另一台PC上或使用不同的浏览器继续相同的会话,这可能是一个安全问题。

    你还写了#34;这个表为每个用户的系统访问添加了一行,因此,它非常臃肿&#34;。我不确定你是说每次用户A访问系统时它都会添加一行(我的应用程序是假的,我只是测试过它),或者你的意思是它为每个访问系统的用户添加一行(是的,以及它的工作方式 - 使用系统的每个用户都有一个会话。也许你可以澄清最后的评论。

答案 1 :(得分:1)

&#34;主键&#34;是矛盾的。一张桌子不能有一个以上的主键&#34;。如上所述,只有一个主键 - 它只是一个包含3个独立字段的 COMPOSITE 键。

这意味着

(42, 127.0.0.1, "Chrome")
(42, 127.0.0.1, "Firefox")
就CI而言,

是两个完全不同的会话,即使IP和会话ID号是重复的。 3向元组是唯一的,但可以复制单个组件。