彩虹岛英雄王披风 9:分隔符在数据库设计和编程中的应用

来源:百度文库 编辑:偶看新闻 时间:2024/04/28 10:10:00

数据库保存的就是列表和关系,对于一些功能单一、文字较短的列表内容,可以使用分隔符将它们隔开,保存在一个字段里,然后通过数组连调用,这样就不必单独开设数据表。这样的设计更科学,调用也更简单。

关于分隔符的使用有一些技巧,以下都是本人的经验总结,希望对初学者有用,也期待高手指正补充。本文所示范的是ASP代码。

一、 分隔符的基本用法

比如会员的好友,我们可以在会员表里设一个字段UserBuddy,将好友以逗号分隔开保存在这个字段里,如:小张,小李,小王 。调用方法:

Buddies = Split(rs("UserBuddy"),",") '通过split函授构造数组

For i=0 to Ubound(Buddies)

 Response.write Buddies(i)

Next

如果小王后面还有一个逗号,则应该是 For i=0 to Ubound(Buddies)-1 ;如果小张前面也有一个逗号,则应该是For i=1 to Ubound(Buddies)-1 。

上面示范的只是基本用法,有时并不科学,后面详解。

二、 分隔符的选择

理论上可以使用任何字符作为分隔符,但实际较常用的是逗号、竖扛和空格。我不推荐使用空格,因为空格是看不见的,放在尾部看不出来有还是没有,而且有些内容本身有必要含有空格,会产生冲突。

在选择分隔符时,应充分考虑所分隔的内容是否有可能且有必要含有分隔符本身,同时我们在设计被分隔的内容字段时也要考虑到分隔符,比如注册会员名时就应该过滤掉空格、逗号、紧扛(实际要过滤掉很多特殊字段,最重要的是单引号,这不在本文讨论之列),再比如我们会在订单里用一个字段来保存产品名称列表,选择使用英文逗号作为分隔符,如 双节棍1,双节棍2,双节棍3 ,那么我们在保存产品名时就需要过滤过英文逗号。

有时我们还有必要使用这样的分隔符:|| ||| ,这样可有效防止冲突,即使被分隔的内容里含有 | 也没关系。但是这样会增加字节数,所以没必要不要用。

三、 分隔符的科学用法

好友例子里说 小张,小李,小王 这种用法不科学,为什么呢?假如小张要加我为好友,但他已经是我的好友了,当然不能让他再加,所以在加好友时都要进行一个验证。

ExistFlag = False

Buddies = Split(rs("UserBuddy"),",")

For i=0 to Ubound(Buddies)

 If User=Buddies(i) Then  'User 是想要加我为好友的会员

  ExistFlag=True

  Exit For

 End if

Next

If ExistFlag=True Then (提示已经是好友了,终止动作)

如果以这样形式来保存:|小张|小李|小王| ,那么验证就相当简单了,只需一句:

If Instr((rs("UserBuddy"),"|"& User &"|") >0 Then  (提示已经是好友了,终止动作)

这样只用1行代码,1个函数就解决了;相比,前面的方法用了9行代码,3个变量、1个函数、1个循环、1个分支,不但代码繁多,执行效率也会低很多。

删除好友也是同样的道理,前面的要通过数组和循环来完成,需要用到一个临时变量,具体代码就不写了,而后面的还是只需要一行代码:

rs("UserBuddy") = replace(rs("UserBuddy"), "|"& User &"|","|")

这种方法普遍适用于内容简短单一的情况,比如论坛的版主、版主管理的版块。

当然,并非任何地方都一定用前导后导分隔符,比如我的订单数据库就是这样的:1,2,3, 因为任何一个操作都会牵涉到很多数据的更新,必须用For循环来解决,加个前导逗号没什么用,反而会增加程序代码。

另外,固定维数和位置的情形只需要在中间加分隔符就行了,比如我只想用一个字段IM来保存QQ,旺旺,MSN,只要这样的就行了: 123654751|jack|abc@hotmail.com 。因为这个是只能修改,不能添加删除的,加前导后导。如果只要调用QQ号:

四、 分隔符的高级用法

通过使用分隔符,我们还可以保存更复杂的数据,比如:1,2|3,4|5,6|7,8 ,这样在分隔的项目里面又有分隔,有时可能会用得到。

还有这种情形:1,2,3,4,5,6,7,8, 我们要用到1 3 5 7 和 2 4 6 8,在画坐标曲线图时可能用到。运行一下以下代码试试:

a="1,2,3,4,5,6,7,8," '项目个数必须是偶数

ag=split(a,",")

for i=0 to ubound(ag)/2-1

  a1=a1&ag(i*2)

  a2=a2&ag(i*2+1) 

next

response.Write a1&"
"&a2