基于SSM的商贸平台项目(第八天)

1.设计方式

1.1打断设计:

传统方式创建对象关联,当业务层级过多,查询效率极速下降,业界有个不成文的规定,在数据库表设计时,关联关系部超过4层。打断设计将业务多级进行分解,硬拆成多个块。具体实现就是通过一个字段来存储两个表之间的关系。存储主表的ID,将多个ID用特殊符号分割。

##1.2数据搬家:(冗余,分次计算)
将合同下的部分信息直接放在报运下的货物表中,这样直接在报运的货物表中查询(无需关心是哪个合同的货物信息,也无需关系货物部分信息和报运部分信息的对应)

由于有分次报运的概念,因为一个货物可以分多次报运,一个合同下的货物信息,可能分多次报运,最终所有货物报运完成。例如:1000,第一次报运800,第二次报运200。不能将报运新增的7个字段,冗余到合同下的货物表中。

报运的附件表实现了整体的数据搬家,为了后续业务在查询货物时,也可以直接查询到附件信息,主要是为财务业务服务。

##1.3分次计算
当系统中有一个集中处理数据的地方,如果它非常耗时,我们对其要进行优化。例如:毛重、净重、体积信息。它会导致用户等待。我们对其进行优化,将集中计算分到不同的地方。我们将总的计算,分解到货物新增时,只计算一条。用户由于本身新增数据,他感觉要保存新增的数据,所以他能容忍稍微等待。在新增时程序动态计算冗余的内容。因为处理数据量极其小,造成处理速度很快,几乎用户感觉不到延迟。

2.特殊设计:一对一;

1) 委托ID就是装箱ID,发票ID就是装箱ID,财务ID就是装箱ID。
2) 委托、发票、财务它们的主键既外键
无论获得一个什么ID,只要是装箱、委托、发票、财务其中之一,就可以获得任何一个它们的对象。

#2.传递数据时,数据可以隐藏到同一个框中
实际开发中少量传递数据的方式。无需查询数据库,提高性能,缺点就需要手动拼串,解串。

// 拼接HTML片段
public String getDivDataCreate(String[] contractIds) {
    StringBuffer sBuf = new StringBuffer();
    for (int i = 0; i < contractIds.length; i++) {
        Export export = exportDao.get(contractIds[i]);
        sBuf.append(
                "<input type=\"checkbox\" name=\"exportIds\" checked value=\"")
                .append(contractIds[i]).append("|")
                .append(export.getCustomerContract())
                .append("\" class=\"input\"/>");
        sBuf.append(export.getCustomerContract()).append("&nbsp;&nbsp;");
    }
    return sBuf.toString();
}

// 拆串拼串
private PackingList spellString(PackingList packingList) {
    String _exportIds = "";
    String _exportNos = "";

    String[] _ids = packingList.getExportIds().split(",");
    for (int i = 0; i < _ids.length; i++) {
        String[] _temids = _ids[i].split("\\|"); // 正则表达式,转义
        _exportIds += _temids[0] + "|";
        _exportNos += _temids[1] + "|";
    }
    _exportIds = UtilFuns.delLastChar(_exportIds); // 去掉最后的“|”
    _exportNos = UtilFuns.delLastChar(_exportNos);

    packingList.setExportIds(_exportIds);
    packingList.setExportNos(_exportNos);
    return packingList;
}