magento是一个开源的网上电子商店软件,功能强大,设计得很灵活。是一个典型的LAMP(Linux+Apache+MySQL+PHP)软件,没想到PHP竟然可以用成这样,真是服了他,很多安装任务也是PHP写的,比如说插件的安装。基于Zend引擎,不过我不知道这是啥冬冬,呵呵。
但是在安装的时候就碰到问题,一种是一个一个下载来安装,第二种是下载xampp,只需要把magento解压到htdocs目录下就可以了,第三中最简单,下载BitNami Magento Stack是一个完整的应用程序堆栈,安装好magento就可以用了,呵呵!
我是从第一种到第二种最后到第三种才成功。第一种下载了相关软件没安装,第二种安装了,数据库死活连不上,尝试几次后就放弃了,初期我还需要点成就感,而且对于AMP没一个熟悉的。第三种安装很顺利,不过还是遇到了点问题,magento后台不能登陆,phpMyAdmin看不到magento的表。后来修改了MySQL的root密码,才能用root登录phpMyAdmin,找到magento后台管理的用户名竟然是user,呵呵。
废话少说,谈点正事。
magento商城的对象层次结构如下:
WebSite — Store() — Root Category(1) — Sub Category() — Product() — Attribute Set(1) — Attribute Group() — Attribute(*)
Product分为三类Simple Product、Configurable Product和Grouped Product,简单商品、可配置商品和组合商品。以笔记本为例,简单商品就是某一具体型号的笔记本,各种配置全部是固定的;可配置商品则是某一型号的系列笔记本,部分配置可选,比如内存大小1G、2G、4G等,硬盘大小100G、200G、300G等,屏幕普通TFT、LED、IPS等;而组合商品则是笔记本和配套商品,比如笔记本+3G上网卡一起买可以优惠。这三类商品的基础是简单商品。
每个商品有一个属性集关联,属性集包含多个属性组,属性组包含多个属性。有些属性是商品一创建就有的,有些是可选的,有些属性不允许为空,有些属性可以,等等。有面向对象的影子在里面。
每个商品都属于某个分类,每个分类体系都有根分类,一个商店关联一个根分类,而且只能关联一个根分类。
从面向对象角度看Product是Class,Attribute Set是Class的定义,每一个具体产品是对象。
但是又感觉商品分类是Class,Product是Object,对象的定义是动态的,属性可变。但是没有传统中的继承关系,仅仅描述的是对象之间的联系,而没有属性继承这样的特性。
magento虽然提供批量导入,但是性能很差,分析下来原因可能有以下几方面:
1、mangento为了系统灵活性,一个商品信息分散在多张表中。
2、一条记录的写入需要执行大量查询。商品分类每一级需要查一次转换为分类编码,带字典的商品属性,如下拉列表、单选和复选框等。虽然保证了数据的质量,但是会给数据导入带来很多麻烦。这个有可能是性能差的主要原因。
3、产品描述等属性采用TEXT字段存储,类似于Oracle的CLOB,字段宽度是不固定的,写入速度比较慢。
4、MySQL数据库需要优化。MySQL数据表存储空间增长方式,大数据量导入时大块大块地分配远远比小块小块的分配效率高。
5、索引更新。数据导入或者更新出了更新数据表,相关的索引也需要更新。
6、外键约束,导致一些不必要的查询。比如一对多关系时,第一条没问题后面的也没有问题。还有一个主表多个从表,一个从表没问题,别的表也没有问题。再有这几条数据就是从一条数据拆出来的,根本就不需要检查约束等等。导入时用程序来保证数据完整性,导入后再启用。
7、数据质量会影响导入速度和稳定性。
8、magento为了灵活性采用的是纵表而不是通常的横表,纵表每个字段一条记录,也是性能问题的另一重要原因。
2和4应该是有很大优化空间的。虽然导入时去掉索引性能会好,但是网上商城通常是24小时服务不能下线的,不可行。
数据质量方面问题比较多有如下几方面:
1、不存在的商品分类,可能是新的商品分类,也可能是数据错误。
2、数据在字典中不存在,比如品牌在品牌字典表中不存在等。
3、产品唯一性编码SKU有重复。如果没有系统化的编码方案会导致编码重复而导入失败。
通常做法是把能导入的写入数据,不能导入的写入错误数据文件,并记录错误原因,手工处理后再次导入。