使用多值数组构建替代数据结构

Build Alternative Data Structures with MultiValue Arrays

我已经使用 PICK 编程几个月了,并且仍在调整以考虑仅使用多值数组的编程解决方案。 PICK 本身不为数据库或内存操作提供任何其他数据结构 * (为了论证忽略维度数组,因为它们仍然是 "array" 的一种类型)

有哪些模仿其他数据结构的创造性方法?我可以想象实现 hash/dictionary 或链表的方法,使用数组和例程来操作它们。这里的一个问题是它会很快变得复杂,因为数据结构的接口不能在概念上简化为一个对象。

是否有任何易于实现的算法供人们用来创建独特的数据结构?


我的系统:我在 PICK 中编写例程,用于 Epicor 的 Eclipse 的附加组件,它位于 UniVerse 之上。我知道 UniVerse 有一个 C# 接口,但我的大部分工作都无法使用它们。

Pick/MultiValue DBMS 允许将多个值存储在一个字段中。

一个常见的例子是街道地址只有一个属性,值是 Street1、Street2 和 Street3。结构如下所示: 01 公司名称 02街1]街2]街3 03城市 04 州...

那些是同一类型的字段,但它们与其他任何内容都不相关。另一个类似的结构是具有多个值相关的属性。通常有一个控制属性和任意数量的依赖属性(atb 26 用作随机示例):

26 ShipDate]ShipDate]ShipDate
27 ShipQty]ShipQty]ShipQty
28 ShipVia]ShipVia]ShipVia

应用程序管理 RI,而不是数据库,但可以使用触发器来允许数据库强制执行 RI。

RDBMS 开发人员可能不喜欢使用该结构,因此我们可以对相关数据使用传统的外键。在这种情况下,我们可能会在运输文件中看到带有记录键的单个属性:

26 1234*01]1234*02]1234*03

所以这些值中的每一个都是另一个文件的键。 *00 值是应用程序维护的每次交付的连续数字 ID。它们可能会在此处使用,以防其中一个交付后来被标记为未确认,因此可以删除该值,留下:

26 1234*02]1234*03

常见的 MVDBMS 平台允许 SubValues 多一层。这些是有保留地使用的,但它们可能非常有价值。考虑单个属性中的上述运输数据:

26 ShipDate\ShipQty\ShipVia ] ShipDate\ShipQty\ShipVia

第二批货物的 ShipVia 将在代码中引用为 Item<26,2,3>

一些开发人员更喜欢使用非系统分隔符。只要在数据中找不到,任何东西都是有效的。您通常会看到星号、斜杠、竖线、逗号或其他一些字母数字:

26 ShipDate|ShipQty|ShipVia ] ShipDate|ShipQty|ShipVia

获取第二个 ShipVia 的代码可能是:

Field(  Item<26,2> , "|" , 3  )

ShipVia 字段本身可能是 table 文件的外键,该文件只有键的 ID 和 atb1 中的 ShipperName。因此,我们讨论的是用于两种文件的相同数据结构:事务数据和大多数静态 tables。它与关系数据库没有什么不同。

是的,您可以创建链表,例如公司记录有一个部门属性。这转化为部门文件,其中有一个经理的属性。这转化为一个员工文件,其中为团队成员分配了一个属性。这些 ID 中的每一个也将转化为员工,其中一些员工也可能是拥有自己团队的经理。这种结构用于物料清单、个人有下线的多层次营销公司,或风险被分解到多个公司的保险业,然后每个公司进一步分解风险。

因此结构具有很多通用性。任何你可以用 RDBMS 或 Key/Value 结构做的事情都可以用 MV 来做。

该答案与您的问题的匹配程度如何?你还想看到什么样的例子?

关于对象,QM MVDBMS 确实具有 OO BASIC,而 Caché DBMS 包含一个 MVDBMS 实现,其中 MV 数据可以作为对象公开。此外,使用 mv.NET 和其他工具,我们可以从字典定义(模式)生成强类型 类,它允许与任何关系平台完全相同类型的 ORM。

我需要更多地了解您要执行的操作,但还有其他数据类型。

如果您想使用其他语言和其他数据结构,请查看 U2 Common Clients。

但是,如果您打算在 UniVerse 中进行服务器端开发,请访问 Rocket Software 网站,获取 "Rocket UniVerse Basic Extensions" 手册: 第 10 章:U2 Dyanmic Object 第 8 章:XML 文档和 UniVerse 文件之间的数据传输。

您可能还想看看 "Rocket UniVerse GCI Guide" "The General Calling Interface (GCI) acts as a gateway from UniVerse BASIC to an external subroutine. The GCI passes data to and from subroutines through arguments and arrays."

http://docs.rocketsoftware.com/nxt/gateway.dll?f=templates$fn=default.htm

最后,虽然它仍处于 Beta 阶段,但您可能感兴趣的是将 Python 与 BASIC 一起用于多值开发。我在 10 月份的 CMUG(科罗拉多多价值用户组)会议上介绍了这个

https://vimeo.com/109520035

迈克·拉杰科夫斯基

火箭软件