一种简化的数据存储方法

时间: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架构程序设计等。

上一篇:城域电子政务光纤传输网施工技术要点 下一篇:浅析电子政务网路安全