欢迎大家讨论:通用SQL定义语言
xjlh 2003-11-14 10:05:42 我们打算研究的一个小课题,请大家多提宝贵意见
通用SQL定义语言
问题提出
1. 数据库版本很多,升级困难。如果对每个版本都写一个升级脚本,则开发和测试的工作量很大(每一种版本的升级情况都要编写脚本并测试);
2. SQL代码和文档不一致。SQL代码和文档是分别编写的,如果其中之一发生改动之后,另外一份也应该作相应的改动,但在实际开发中很难做到这一点,这就造成了SQL 代码和文档的不一致,影响后续开发和维护工作。
解决方法-General SQL(通用SQL语言,简称GSQL)
定义一种通用的数据定义语言(与具体的数据库无关),用此语言定义数据库的表结构,同时这个语言也可以直接生成数据结构文档。
当升级时,通过一个通用的升级工具读取最新的数据定义(采用GSQL编写),然后与待升级的数据库对照,生成差异脚本后执行,就可以完成升级过程。
文档可以通过一个文档生成工具,从数据定义(采用GSQL编写)直接生成文档。
注意:GSQL只是数据定义语言,不涉及数据操作(如:SELECT、INSERT、UPDATE、DELETE等)。
为什么采用GSQL
1. 标准SQL比较复杂,升级工具的自动分析比较困难;
2. 标准SQL存在很多方言,不适合学习和使用;
3. GSQL语法简单,易于程序自动分析,并自动生成升级脚本和文档;
4. 由于GSQL语法简单,也容易学习和推广;
研究计划
时间:一个人月
1. 定义出GSQL的语法(如:表定义、字段定义、索引、数据类型等);
2. 文档生成工具,用于分析GSQL语法并生成文档;
3. 通用升级工具,用于分析GSQL语法,对比目标数据库,并生成差异升级脚本。
附录1-GSQL数据结构描述
table ::= tablename + remark + column* +index*
column ::= name+remark+datatype+length+dicimals+ isnotnull+defaultvalue
index ::= indexname+remark+indextype+column*
indextype ::= {unique | primarykey | ordinary} + remark
datatype ::= SCounter | SInt | SNumric|SDatetime| SString | SBlob |SBool
附录2-GSQL的物理实现
XML风格
<table name="$TableName" tablecode="$TableCode">
<column name="$ColumnName" columncode="$columncode" remark="$Remark" datatype="$Datatype" length="$length" dicimals="$decimals" isnotnull="$isnotnull" defaultvalue="$defaultvalue"/>
<index name="$IndexName" remark="$Remark" indextype="$Indextype" >
<column name="$ColumnName">
</index>
</table>
文档风格(通过tab键作为column描述的定界符号)
#-------------------------
table:$TableName $TableCode
column:$ColumnName
columnode=$ColumnCode
datatype=$Datatype
length=$length
dicimals=$decimals
isnotnull=$isnotnull
defaultvalue=$defaultvalue
index :$IndexName $ColumnName,$ColumnName,$ColumnName,...
#-------------------------
中文文档风格
注意:(通过tab键作为column扩展描述的定界符号) "#-"#10#13 作为表的定界符号
#-------------------------
表:$TableName
表描述:$remark
列:$ColumnName
编码=$columncode
数据类型=$Datatype
长度=$length
小数位=$decimals
是否空=$isnotnull
缺省值=$defaultvalue
列描述=$remark
索引 :$IndexName $IndexType $ColumnName,$ColumnName,$ColumnName,...
#-------------------------
lisp风格
$remark 需要有定界符号
($TableName $TableCode
(column $ColumnName $ColumnCode $Datatype $length $decimals $isnotnull $defaultvalue $Remark)
(index $IndexName $Remark $Indextype
($ColumnName $ColumnName $ColumnName ...)
)
)
中文文档风格例子
Create table base (
f1 integer default 1 not null primary key,
f2 string (3)
)
对应:
#-------------------------
表:基本表 base
表描述:基本表格,可以书写描述并能够换行
列:f1的名字
编码=f1
数据类型=SInt
是否空=否
缺省值=1
列描述=备注
列:f2的名字
编码=f2
数据类型=String
长度=3
是否空=是
缺省值=1
列描述=备注
索引 :pk_name 主键 f1
#-------------------------