我想了解为什么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_address
和user_agent
为primary_keys,而不仅仅是索引?有什么区别?
另一个信息是,这个表为每个用户的系统访问添加了一行,因此,它非常臃肿。
编辑:想到的另一个问题。我为什么要关心用户代理匹配?
答案 0 :(得分:2)
这里的想法是每个会话都是独一无二的。它如何识别会话?通过主键中的三个值:session_id
,ip_address
和user_agent
。
如果你考虑一下,这是有道理的:
session_id
发生变化,那么(显然)您正在处理其他(新)会话。ip_addess
发生变化,那么有人会从另一台PC登录 - 这将是一个新会话。user_agent
值发生变化,那么有人会使用其他浏览器 - 再次,这将是一个新会话。因此,假设只有session_id
是主键:更改ip_address
或user_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向元组是唯一的,但可以复制单个组件。