1

我有一个问题来自IBM 的嵌套关系数据库白皮书的第 16 页,我很困惑为什么在下面的CREATE命令中他们使用 MV/MS/MS 而不是 MV/MV/MS,当两者ORDER_#都是PART_#一对多关系.. 我不明白非 1nf 数据库设计中的值和子值是什么意思。我也想知道更多关于该ASSOC ()条款的信息。

IBM 的嵌套关系数据库白皮书第 16 页(对空格稍作修改)

    CREATE TABLE NESTED_TABLE (
      CUST# CHAR (9) DISP ("Customer #),
      CUST_NAME CHAR (40) DISP ("Customer Name"),
      ORDER_# NUMBER (6) DISP ("Order #") SM ("MV") ASSOC ("ORDERS"),
      PART_# NUMBER (6) DISP (Part #") SM ("MS") ASSOC ("ORDERS"),
      QTY NUMBER (3) DISP ("Qty.") SM ("MS") ASSOC ("ORDERS")
    );

IBM 嵌套关系数据库将嵌套表实现为重复属性和重复的关联属性组。SM 子句指定属性是重复的(多值--“MV”)或重复组(多子值--“MS”)。ASSOC 子句将嵌套表中的属性关联起来。如果需要,IBM 嵌套关系数据库可以支持一个基表中的多个嵌套表。需要以下标准 SQL 语句来处理图 5 的 1NF 表以生成图 6 中所示的报告:

    SELECT CUSTOMER_TABLE.CUST#, CUST_NAME, ORDER_TABLE.ORDER_#, PART_#, QTY
    FROM CUSTOMER_TABLE, ORDER_TABLE, ORDER_CUST
    WHERE CUSTOMER_TABLE.CUST_# = ORDER_CUST.CUST_# AND ORDER_CUST.ORDER_# =
    ORDER _TABLE.ORDER_#;

                                       Nested Table
                Customer #       Customer Name Order #        Part #   Qty.
                AA2340987        Zedco, Inc.      93-1123     037617   81
                                                              053135   36
                                                  93-1154     063364   32
                                                              087905   39
                GV1203948        Alphabravo       93-2321     006776   72
                                                              055622   81
                                                              067587   29
                MT1238979        Trisoar          93-2342     005449   33
                                                              036893   52
                                                              06525    29
                                                  93-4596     090643   33
4

2 回答 2

1

我将继续回答我自己的问题,同时为我在 pg 55 上遇到的代码为DBA 提供 IBM 的 UniVerse SQL 管理。CREATE TABLE

ACT_NO INTEGER FORMAT '5R' PRIMARY KEY
BADGE_NO INTEGER FORMAT '5R' PRIMARY KEY
ANIMAL_ID INTEGER FORMAT '5L' PRIMARY KEY

(见下面令人分心的旁注)起初这让我很开心,但本质上我相信这是一个列指令,与表指令相同PRIMARY ( ACT_NO, BADGE_NO, ANIMAL_ID )

后来在第 5-19 页,我看到了这个

ALTER TABLE LIVESTOCK.T ADD ASSOC VAC_ASSOC (
    VAC_TYPE KEY, VAC_DATE, VAC_NEXT, VAC_CERT
);

这让我相信ASSOC (VAC_ASSOC)加入一个专栏是一样的......就像这样

CREATE TABLE LIVESTOCK.T (
    VAC_TYPE ... ASSOC ("VAC_ASSOC")
    VAC_DATE ... ASSOC ("VAC_ASSOC")
    VAC_NEXT ... ASSOC ("VAC_ASSOC")
    VAC_cERT ... ASSOC ("VAC_ASSOC")
);

无论如何,我不是 100% 确定我是对的,但我猜顺序并不重要,而且这些不是不及物关联,它们只是一个不区分顺序的分组。

向前!MS对于与and相关的问题的第二部分MV,我终其一生都无法弄清楚 IBM 到底是从哪里得到这种语法的。我相信这是虚构的。我无法访问可以用来测试的开发机器,但我在旧的 10.1 或新的UniVerse 10.3 SQL 参考中找不到它(术语 MV)

对于那些不习惯 UniVerse 的人的旁注5R,并且5L意味着 5 个字符右对齐或左对齐。这是表格元数据中内置的显示功能……Google for UniVerse FORMAT(或 FMT)以获取更多信息。

于 2010-01-07T23:19:03.523 回答
1

正如您所知,属性、多值和子多值来自于它们构建数据的方式。

本质上,所有数据都存储在某种树中。UniVerse 是一个多值数据库。通常,它不像 SQL 工作函数的关系数据库那样工作。

每条记录可以有多个属性。

每个属性可以有多个多值。

每个多值可以有多个子多值。

所以,如果我有一个叫 FRED 的记录

那么,FRED<1,2,3>指的是第1个属性,2个多值位置和3个子值位置。

要了解有关它的更多信息,您需要了解有关 UniVerse 工作原理的更多信息。SQL 部分只是其中的一部分。我建议您阅读其他手册以了解您正在使用的内容。

编辑

本质上,上面的代码告诉你:

每个客户可能有多个订单。这些存储在“表”中的 MV 级别

每个订单可能有多个零件。这些存储在“表”中的 MS 级别

每个订单可能有多个数量。这些存储在“表”中的 MS 级别。由于它们处于同一水平,尽管它们在订单上是 1-n,但在零件方面它们是 1-1。

于 2010-01-14T22:59:22.323 回答