我在供应商提供给我们的生产环境中遇到了一些现有代码。它们使用字符串存储逗号分隔值以存储来自DB的过滤结果。请记住,这是一种名为PowerOn 的专有脚本语言,它与驻留在AIX系统上的数据库进行交互,但它是一种支持字符串,整数和数组的语言。
例如,我们有;
Account
----------------
123
234
3456
28390
psuedo代码可能看起来像;
Define accounts As String
For Each Account
accounts=accounts + CharCast(Account) + ","
End
与我希望看到的东西相反
Define accounts As Integer Array(99)
Define index as Integer=0
For Each Account
accounts(index)=Account
index=index+1
End
循环完成时,accounts
看起来像; 123,234,3456,28390,
。该字符串稍后用于测试特定实例是否存在,如此
If CharSearch("28390", accounts) > 0 Then Call DoSomething
在该示例中,语句的计算结果为true,并且DoSomething
被调用。 考虑到数组的选项,为什么要在一串逗号分隔值中存储整数值?我遇到的每种语言,执行基于字符串的操作几乎总是比基于整数的操作更昂贵
考虑到我之前没有见过这种技术,而且我的经验有所限制,有没有这个名字?这是常见的做法,还是仅仅是另一个字符串类型的例子?要扩展现有代码,我应该继续使用字符串方法吗?我们是否从供应商处获得了严格的代码?
答案 0 :(得分:2)
我在评论中的内容仍然存在,但我的真实答案是:它可能是关于兼容性/可移植性的设计决策。在整数数组的情况下(以及足够低的API级别),您通常会发现自己会问一些问题,例如,对“今天”机器上整数大小的安全猜测。那么字节序呢。
所有数据格式中最便携和最灵活的一直是并且始终将是打印表示。它可能没有那么快处理,但这就是适配器/转换器或者这样的地方。我不会惊讶地发现(人类可读的)在像你这样的数据库API中的特别是的表示描述
如果你想要快速的东西,只需拿走给你的东西,将它转换成更有效的内部格式,你处理并转换回来。
答案 1 :(得分:0)
使用逗号分隔的字符串而不是数组没有任何内在错误。当然你不能随便访问这样一个集合的随机n
元素,但是如果不需要这样的随机访问那么它就没有惩罚了,对吧?
据我所知,Oracle DB将NUMBER
值存储为字符串(如果我的记忆是正确的,那么对于DATE
也是如此)。
在您的具体示例中,在处理传递数据而不跨越进程边界时,使用字符串看起来有点过分。但是,当通过网络发送数据或存储在磁盘上时,字符串数据类型的选择是否更有意义?