曹
曹晓钢
Unregistered / Unconfirmed
GUEST, unregistred user!
近来对生成机很感兴趣。
要使用生成机(Generator),以下简称Gen,必须是建立在一个确定的编码基础和规范之上的。
先从头说一下问题的由来。
编写数据库相关的程序,以往在非面向对象编程的时代,是通过直接调用SQL语句来实现的。
现在是需要编写相关的类来操作数据库。每一个类可以对应一个Java类,那么这些类操作数据库
的基本代码是相同,唯一不同的是property和get/set方法。(暂且不考虑特定的附加函数)除此之外,
还要考虑类和类之间的关系,比如A和B 是1:N关系等等。
为了最好的描述database,第一个想到的当然就是SQL语句
比如
Create table PO (
PO_NO VARCHAR2(20) NOT NULL,
CUSTOMER VARCHAR(20) NOT NULL,
PO_DATE DATETIME,
QTY NUMBER,
PRIMARY KEY PK_PO (PO_NO)
)
可以看到,如果程序来处理这样的SQLscript会有不小的困难,比如不同的数据库的字段类型是不同的。
在这种情况下,XML Schema是最好的一个选择。由于Schema标准直接支持数据类型,所以带来了一些便利。
而且由于XML本身是很容易扩充的,加上诸如validate regexp pattern等等也很容易。
这时,我们面临着如何选择XML schema的问题。
第一个想到的就是有没有这样的标准。很可惜,我到现在都没有找到相关的标准。
第二选择就是自己实现。缺点是不便于交流。
第三是看现有的一些工具。
现在就汇报一下我试验过的工具。
1,XML Spy 版本4.1
XML Spy支持从DBMS中直接generate XML Schema.
如下是一个例子:
XML spy正确的生成了所有字段的声明和类型,但是令人失望的是,他没有正确的生成
Index的信息。所有的主键,外键都丢失了。从XML spy的文档看,他只有在dbms是access和
其他几个数据库的时候才能正确的得到Index信息。
2, Power designer 版本8
Power design 版本8可以从数据库中reverse engineer出physical模型,然后生成XML schema 模型。
结果是:
<?xml version = "1.0"?>
<schema name="PhysicalDataModel_1.xml">
<element name="PO_MASTER">
<element name="PO_NO" type="string"/>
<element name="SUPPLIER_CODE" type="string"/>
<element name="PO_DATE" type="date"/>
<element name="SHIPPING_MODE" type="string"/>
<element name="SUPPLIER_ADDRESS" type="string"/>
<element name="ORDER_TYPE" type="double"/>
<element name="CUST_CODE" type="string"/>
</element>
</schema>
结果倒是比较容易看懂,问题是他也没有生成index。而且语法也有些过时。
3, PowerDesigner 版本9
我试验的是版本9的eval版本。
结果是:
<?xml version = "1.0" encoding="UTF-8"?>
<xsd:schema name="PhysicalDataModel_1.xsd" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="PO_MASTER">
<xsd:element name="PO_NO" type="xsd:string"/>
<xsd:element name="SUPPLIER_CODE" type="xsd:string"/>
<xsd:element name="PO_DATE" type="xsd:date"/>
<xsd:element name="SHIPPING_MODE" type="xsd:string"/>
<xsd:element name="SUPPLIER_ADDRESS" type="xsd:string"/>
<xsd:element name="ORDER_TYPE" type="xsd:double"/>
<xsd:element name="CUST_CODE" type="xsd:string"/>
</xsd:element>
</xsd:schema>
可惜仍然没有Index 生成。这一次开始使用xsd空间了。
鉴于手头就这么几个工具,我也没有找到更好的结果。
如果各位也对这个部分感兴趣,请说一下您的结果。
要使用生成机(Generator),以下简称Gen,必须是建立在一个确定的编码基础和规范之上的。
先从头说一下问题的由来。
编写数据库相关的程序,以往在非面向对象编程的时代,是通过直接调用SQL语句来实现的。
现在是需要编写相关的类来操作数据库。每一个类可以对应一个Java类,那么这些类操作数据库
的基本代码是相同,唯一不同的是property和get/set方法。(暂且不考虑特定的附加函数)除此之外,
还要考虑类和类之间的关系,比如A和B 是1:N关系等等。
为了最好的描述database,第一个想到的当然就是SQL语句
比如
Create table PO (
PO_NO VARCHAR2(20) NOT NULL,
CUSTOMER VARCHAR(20) NOT NULL,
PO_DATE DATETIME,
QTY NUMBER,
PRIMARY KEY PK_PO (PO_NO)
)
可以看到,如果程序来处理这样的SQLscript会有不小的困难,比如不同的数据库的字段类型是不同的。
在这种情况下,XML Schema是最好的一个选择。由于Schema标准直接支持数据类型,所以带来了一些便利。
而且由于XML本身是很容易扩充的,加上诸如validate regexp pattern等等也很容易。
这时,我们面临着如何选择XML schema的问题。
第一个想到的就是有没有这样的标准。很可惜,我到现在都没有找到相关的标准。
第二选择就是自己实现。缺点是不便于交流。
第三是看现有的一些工具。
现在就汇报一下我试验过的工具。
1,XML Spy 版本4.1
XML Spy支持从DBMS中直接generate XML Schema.
如下是一个例子:
代码:
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="PO_MASTER">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="PO_NO">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:maxLength value="20"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
<xsd:element name="SUPPLIER_CODE">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:maxLength value="10"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
<xsd:element name="PO_DATE" type="xsd:dateTime"/>
<xsd:element name="SHIPPING_MODE">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:maxLength value="10"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
<xsd:element name="SUPPLIER_ADDRESS">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:maxLength value="10"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
<xsd:element name="ORDER_TYPE" type="xsd:decimal"/>
<xsd:element name="CUST_CODE">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:maxLength value="10"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
Index的信息。所有的主键,外键都丢失了。从XML spy的文档看,他只有在dbms是access和
其他几个数据库的时候才能正确的得到Index信息。
2, Power designer 版本8
Power design 版本8可以从数据库中reverse engineer出physical模型,然后生成XML schema 模型。
结果是:
<?xml version = "1.0"?>
<schema name="PhysicalDataModel_1.xml">
<element name="PO_MASTER">
<element name="PO_NO" type="string"/>
<element name="SUPPLIER_CODE" type="string"/>
<element name="PO_DATE" type="date"/>
<element name="SHIPPING_MODE" type="string"/>
<element name="SUPPLIER_ADDRESS" type="string"/>
<element name="ORDER_TYPE" type="double"/>
<element name="CUST_CODE" type="string"/>
</element>
</schema>
结果倒是比较容易看懂,问题是他也没有生成index。而且语法也有些过时。
3, PowerDesigner 版本9
我试验的是版本9的eval版本。
结果是:
<?xml version = "1.0" encoding="UTF-8"?>
<xsd:schema name="PhysicalDataModel_1.xsd" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="PO_MASTER">
<xsd:element name="PO_NO" type="xsd:string"/>
<xsd:element name="SUPPLIER_CODE" type="xsd:string"/>
<xsd:element name="PO_DATE" type="xsd:date"/>
<xsd:element name="SHIPPING_MODE" type="xsd:string"/>
<xsd:element name="SUPPLIER_ADDRESS" type="xsd:string"/>
<xsd:element name="ORDER_TYPE" type="xsd:double"/>
<xsd:element name="CUST_CODE" type="xsd:string"/>
</xsd:element>
</xsd:schema>
可惜仍然没有Index 生成。这一次开始使用xsd空间了。
鉴于手头就这么几个工具,我也没有找到更好的结果。
如果各位也对这个部分感兴趣,请说一下您的结果。