时间:2022-10-18 02:02:19
摘 要: 在基于B/S架构的数据库设计中,通常存在大量不同的数据表,数据间逻辑结构复杂,检索查询效率低下。拟以一种新的思路,简化数据表存储结构,以期提高数据存取及查询效率,简化数据操作。
关键词: 数据存取;数据库;字符串;数组
1 设计思路
通常在基于B/S(Browser/Server,即浏览器/服务器模式)的设计开发中,数据库设计是非常重要的环节,优秀的数据存储结构不仅能够简化对大量繁杂数据的访问,而且能够显著提高数据存取效率,简化设计人员对数据库访问的程序设计工作,从而大幅提高设计开发的工作效率[1]。
一般情况下,在数据库设计中,往往使用大量数据表(table)来存储开发项目中的相关表格且呈一一对应模式。这样不仅数据量庞大,且数据间关系错综复杂,程序设计工作也因此而变得效率低下。在本文的方法中,仅使用一个数据表,将各表单数据以字符串形式存于该数据表的text字段中,即可实现繁杂的数据存储,从而大大地提高了开发同期,简化了程序设计工作。
2 实现方法
在以往的数据库设计中,假设某设计项目需用n张表,往往在数据库中也对应设计n个数据表,如表1所示。
表1 数据库中与项目对应的n张数据表
而本文提出的方法,仅使用一个数据表(设表名为mytable),即可实现对上述若干数据表的存储。数据表结构如表2所示。
表2 数据表结构[2]
在B/S设计中,数据一般通过表单形式从客户端提交到服务器数据库中保存,因此,首先在客户端需要使用JavaScript脚本语言对表单数据进行编辑,形成数据字符串,再提交到数据库保存。JavaScript代码如下
function getstr() {
//调用getFormValue函数将表单内容合成字符串
str = getFormValues(document.getElementById('myf
Orm'));
//将合成好的字符串放入表单隐藏域content中
document.myform.content.value=str;
//提交表单
document.myform.submit();
}
其中,getFormValue函数如下:
function getFormValues(fobj) {
var str = "";
var valueArr = null;
var val = "";
var cmd = "";
var elemvalue = "";
var elemlength = fobj.elements.length;
for(var i = 0;i < elemlength;i++) {
var elemtype = fobj.elements[i].type;
var elemname = fobj.elements[i].name;
if(elemtype=="text" || elemtype=="textarea" || elemtype=="hidden") {
if (elemname != "content") {//过滤content不参与编码
elemvalue = fobj.elements[i].value;
str += elemname + "=" + elemvalue; //字段名与值使用=号连接
if(i!=elemlength)
str += "&"; //各字段间使用&符号连接
}
}
else if(elemtype=="select-one") {
elemvalue = fobj.elements[i].options[fobj.e
Lements[i].selectedIndex].value;
str += elemname + "=" + elemvalue;
if(i!=elemlength)
str += "&";
} else if(elemtype=="checkbox") {
elemvalue = fobj.elements[i].checked;
str += elemname + "=" + elemvalue;
if(i!=elemlength)
str += "&";
}
}
str = str.substr(0,(str.length - 1)); //剔除最后一个分隔符
return str;
}
在表单myform中,除正常需提交的数据外,再使用一个隐藏域content,在提交表单时,需使用onclick事件执行getstr()函数,即可在表单中增加一个content值。表单形式如下:
…………(其他表单数据项)
然后在PHP程序中读出content值,写入数据库(以下以PHP+MySQL为例):
if ($_POST["content"]) {
//定义当前表的名字
$tablename = "mytable";
$str = $_POST["content"]; //读出content的值
mysql_query("insert mytable value (0,'$tablename','$str')"); //写入数据库中
}[3]
这样,就完成了把表单数据字符串化后存入数据表mytable中的目的。
3 数据访问
3.1 数据修改
数据完成存储后,对数据的访问只需要读取和修改即可。由于表单所有数据均存于字符串中,因此,使用PHP函数explode分离字符串形成数组,再对数组进行修改,最后再合并成新的字符串存回。于是使用PHP+MySQL写出如下数据修改函数:
function modifyvalue($sid,$name,$value)
{
$str = '';
$result = mysql_query("select * from mytable where sid='$sid'");
$rarray = mysql_fetch_array($result);
$arr1=explode('&',$rarray[content]); //将content字符串分离成数组
for ($i=0;$i
$arr2=explode('=',$arr1[$i]); //分离字段名与值
if ($arr2[0]==$name) //找到要修改的字段,修改数据
$arr2[1]=$value;
$ss = $arr2[0]."=".$arr2[1];
$str .= $ss."&"; //合并成新的字符串并存回去
}
$str = substr($str,0,strlen($str)-1);
mysql_query("update mytable set content='$str' where sid='$sid'");
}
函数说明:modifyvalue有三个形式参数,sid用于识别工作进程,name是要修改的字段名称,value是要修改的字段值。调用方法为:
modifyvalue(sid,'姓名','张三');
即可将sid所指的“姓名”字段值修改为“张三”。
3.2 数据读取
数据读取函数如下:
function getvalue($tablename,$pos)
{
$key = '';
$result = mysql_query("select * from mytable where table_name='$tablename'");
while ($ru = mysql_fetch_array($result)) {
$str = explode('&',$ru[content]); //字符串content分离成数组
$xx = strval(substr($pos,0,2))-1; //取值的开始位置
$yy = strval(substr($pos,2,2)); //连续取几个字段值
$zz = $xx+$yy;
for ($i=$xx;$i
$ser = explode('=',$str[$i]);
$key .= $ser[1]. '|'; //取出的字段值拼成字符串,以|符号分隔
}
}
$key = substr($key,0,strlen($key)-1);
return $key; //返回此字符串
}[4-5]
函数说明:该函数有二个形式参数,tablename是要读的数据表名称,pos是读取位置。设“姓名”字段在表中第2个位置,“性别”字段在表中第3个位置,则调用方法为:
$str = getvalue(tablename, '0201');
则str变量的值为字段“姓名”的值。如果是这样调用:
$str = getvalue(tablename, '0202');
则str变量的值为“姓名|性别”的字符串。这样,全表查询显得非常简单。例如,keyword变量中赋值查询关键字,假设全表有30个字段,则:
$keyword = 查询关键字;
$str = getvalue(tablename, '0130');
$flag = strchr($keyword,$str);
即可按关键字进行全表检索,显著提高了数据检索效率。
4 结语
本文讨论了一种新的数据存储方式,这在具有重复性工作的项目设计中具有非常明显的效率提升,并可以在此基础上扩展数据检索功能。采用此方式进行设计时,需要注意的是表单中必须包括数据表的所有项目,即使是不需要手工输入而从其他表中读取的项,也要通过使用表单隐藏域的方法将值写入隐藏域中,以免造成数据的缺失。
参考文献:
[1](加)麦克阿瑟,PHP高级程序设计[M]. 汪泳译,人民邮电出版社,2009:118-120.
[2]简朝阳,MySQL性能调优与架构设计[M].电子工业出版社,2009:178-180.
[3]保罗·戴特尔,JavaScript程序员教程[M].电子工业出版社,2010:210-240.
[4]傅志红编,PHP与MySQL程序设计[M].第3版,人民邮电出版社,2009:268-270.
[5]漆涛,算法与数据结构[M].电子工业出版社,2009:159-164.
作者简介:
杨群林(1979-),女,讲师,研究方向为现代教育技术及计算机应用;宋文峰(1966-),男,讲师,研究方向为计算机网络技术、B/S架构程序设计等。