shop 系统结构 (三):数据库结构及业务模型

五、数据库结构定义文件 

  在485之前,我们使用powerdesigner来管理这些表结构,但是在一些项目的版本管理过程中,有时需要维护多个版本。powerdesigner的储存文件为一个单一的巨大的xml格式pdm文件。这在进行版本的合并分支时几乎无法处理。而在485里,我们使用php去描述表结构有了以下几个优势: 

  数据库定义具有版本管理特性 各分支开发互不干扰 协同更改时,可以进行合并操作 针对单表的版本还原与操作日志 容易做自动化的表结构对比 更快速的getInsertSQL/getUpdateSQL: 不需要select * from xxx where 0=1 插件可以有自己的表定义文件 model::getColumns自动化做准备 按照用途来定义字段类型,不会出现同一种数据类型而字段定义不一致的情况 简单的外键实现,方便的统计表的依赖关系,使得外键字段定义完全一致 更好的mysql版本兼容:type = MyISAM DEFAULT CHARACTER SET语法 很方便的实现gbk/utf8多版本现在这些数据库定义文件放置在 core/schemas 下面,每个表一个php文件, 样例: 

<?php

$db['table_name'] = array(

    'columns'=>array(

        'col_1'=>array('type'=>'int',

            'pkey'=>true,'comment'=>'id字段'), //主键

        'col_p1'=>array('type'=>'int',

            'pkey'=>true,'comment'=>'主键2'),   //联合主键

        'col_33'=>array('type'=>'mediumint unsigned'),

        //当然也支持通常的type

        'col_2'=>array('type'=>'email',

            'comment'=>'id字段'),  //email = varchar(255)

        'col_3'=>array('type'=>'money',

            'notnull'=>true,'default'=>3),

        //money = decimal(20,3),非空字段,默认为3.000

        'col_4'=>array('type'=>'html',

            'comment'=>'id字段'),   //html = text

        'col_4'=>array('type'=>'bool',

            'comment'=>'id字段'),   //bool = enum('true','false')

        'table2_c1'=>array('type'=>'table_2:c1',

            'comment'=>'table_2c1字段'),

        //类型和table_2c1字段相同,当外键处理,自动加索引

    ),

    'index'=>array(

        '...',//再定义

    )

    'engine'=>'heap'//可不填,默认为myisam

    'option'=>''//其他扩展语法

);

  好了,现在一切的表结构都可以被系统精确控制了。利用这个东西,我们实现了485里的数据表结构比较功能,并且以这个为基础建立了新的升级机制。并且在未来,这将是app体系的一个基石,关于app体系,我将在后来的章节讲解,这将是一个神奇的东西。 

六、网店对象

  在model里面,有一些特别特别的类是基于shopObject这个类的。 shopObject用来表示一些有共性和意义的对象,比如商品,订单,会员。有一些抽象的共用方法。 

每个shopObject都有一个绑定的表,并且标明了哪些字段是主键。因此我们可以做一些批量的东西。后台的订单列表,商品列表,会员列表等等。我们给他取名为finder。在此向osx致以敬意。 

函数名

参数

返回值

说明

is_highlight($row)

行数据

bool

用来判断是否将该行高亮

  因此如果你想修改这些默认行为,比如在列上加些自定义的字段,而这个字段可能完全不是数据库里,而存在于其他某外部系统中。那么很简单,你只需要重载对应的方法即可。 

  你可以去思考将这个重载放在哪一层。如果希望所有调用这个数据的地方都变化,那么就重载model 如果只是希望后台的列表增加一个列,就重载他的控制器即可shopObject还有一个特性,就是支持事件广播。他有一个特殊的方法:shopObject::fireEvent($eventName) 用来广播事件。其他对象采用观察者模式listen到感兴趣的对象上。 

  当订单新建时,系统会调用相应的$orderModel->firevent('create')方法,这时所有关注order-create的函数就全都被纷纷调用,有的负责发邮件通知用户,有的负责记录的数据库,有的可能是插件写的:将这些事件广播道某esb系统里。 

  这时一条网店系统的数字神经,当订单新建,或者会员登录的时候。我们可以通过外挂的脚本做一些触发事件。这也是485网店机器人的基础。 

七、业务模型(model)

  模型是前后台公用。完成业务逻辑,所有的数据库操作,文件等资源调用,都由此层实现

  模块调用方法$systme->loadModel(path/to/a/model); 载入过程如图所示: 

posted @ 2012-05-05 17:34  system.lv  阅读(231)  评论(0)    收藏  举报