+ -
当前位置:首页 → 问答吧 → DZ数据表设计问题

DZ数据表设计问题

时间:2011-07-04

来源:互联网

CREATE TABLE pre_common_banned (
  id smallint(6) unsigned NOT NULL auto_increment COMMENT '禁止id',
  ip1 smallint(3) NOT NULL default '0' COMMENT 'IP分段1',
  ip2 smallint(3) NOT NULL default '0' COMMENT 'IP分段2',
  ip3 smallint(3) NOT NULL default '0' COMMENT 'IP分段3',
  ip4 smallint(3) NOT NULL default '0' COMMENT 'IP分段4',
  admin varchar(15) NOT NULL default '' COMMENT '管理员姓名',
  dateline int(10) unsigned NOT NULL default '0' COMMENT '禁止时间',
  expiration int(10) unsigned NOT NULL default '0' COMMENT '过期时间',
  PRIMARY KEY  (id)
) ENGINE=MyISAM COMMENT='禁止访问表';


以上是DZ官方的一个数据表,
在官方有这么一段话:

MEMORY/HEAP类型的表中,要尤其注意规划节约使用存储空间,这将节约更多内存。例如cdb_sessions表中,就将IP地址的存储拆分为4个tinyint(3) UNSIGNED类型的字段,而没有采用char(15)的方式;


求高人解惑。。。。
为啥是三个 tinyint(3)  而不是一个 无符号的 int  不是更加合理吗?

作者: 1033289127   发布时间: 2011-07-04

MEMORY/HEAP类型的表中,要尤其注意规划节约使用存储空间,这将节约更多内存。例如cdb_sessions表中,就将IP地址的存储拆分为4个tinyint(3) UNSIGNED类型的字段,而没有采用char(15)的方式;

这一句不是说的很清楚了?

作者: Frears   发布时间: 2011-07-04

二楼难道也认为,四个tinyint(3) 会比一个 无符号int更节省空间?

作者: 1033289127   发布时间: 2011-07-04

TINYINT 占1个字节
int 占4个字节

4个tinyint(3) UNSIGNED类型的字段 占4个字节

虽然你提到使用int,但是……int不能存储“点”。
这个问题提到的是IP,IP是类似 122.226.224.169 这样的字符串,很显然不是用INT的

作者: kuhanzhu   发布时间: 2011-07-04

引用:
原帖由 kuhanzhu 于 2011-7-4 15:42 发表
TINYINT 占1个字节
int 占4个字节

4个tinyint(3) UNSIGNED类型的字段 占4个字节

虽然你提到使用int,但是……int不能存储“点”。
这个问题提到的是IP,IP是类似 122.226.224.169 这样的字符串,很显然不是用 ...
说得太有道理了,,顺便学习起来。

作者: bibi8451   发布时间: 2011-07-04

高手就是高手呀,人家跟我争了半天了。

[ 本帖最后由 Frears 于 2011-7-4 15:59 编辑 ]

作者: Frears   发布时间: 2011-07-04

顶管理员一个
但是,从数据库处理效率方面讲,一个int的效率要优于tinyint保存

这是摘自DZ程序的一段代码  用与保存获取IP的

       function set($key, $value) {
              if(isset($this->newguest[$key])) {
                     $this->var[$key] = $value;
              } elseif ($key == 'ip') {
                     $ips = explode('.', $value);
                     $this->set('ip1', $ips[0]);
                     $this->set('ip2', $ips[1]);
                     $this->set('ip3', $ips[2]);
                     $this->set('ip4', $ips[3]);
              }
       }

       function get($key) {
              if(isset($this->newguest[$key])) {
                     return $this->var[$key];
              } elseif ($key == 'ip') {
                     return $this->get('ip1').'.'.$this->get('ip2').'.'.$this->get('ip3').'.'.$this->get('ip4');
              }
       }

明显没有  ip2long,long2ip(mysql php都有这两个函数的,这两个函数是IP字符串同整数之间转换的函数)函数处理的快(没做实验,从经验来讲的)
我现在想说的是4个tinyint的存储空间占用铁定的没有比int的少,但是无论从 mysql的查询效率或者是程序的运行效率都是没有使用无符号int的优越,但是官方使用的是 4个无符号tinyint  其中有什么原委?(目前没有看到官方在利用“.”)

作者: 1033289127   发布时间: 2011-07-04

他应该只是说4个tinyint比char(15)来的省空间,并没有提及 int。
我觉得四个tinyint和一个int都是储存一个32位IP地址的方法,用哪种方法其实都可以吧,至于效率方面我也没做过测试。可能DZ这么做有其他道理,也可能没有考虑的那么细致。

作者: lujjjh   发布时间: 2011-07-04

热门下载

更多