我从IBM's Nested Relational Database White Paper的第16页提出了一个问题,我很困惑为什么在下面的CREATE
命令中他们使用MV / MS / MS而不是MV / MV / MS,两者都是{ {1}}和ORDER_#
是一对多关系。我不明白在非1nf数据库设计中,vs子值意味着什么值。我也想知道更多关于PART_#
条款的信息。
ASSOC ()
IBM嵌套关系数据库将嵌套表实现为重复属性和 重复关联的属性组。 SM子句指定属性是重复(多值 - “MV”)还是重复组(多子值 - “MS”)。 ASSOC子句关联嵌套表中的属性。如果需要,IBM嵌套关系数据库可以支持基表中的多个嵌套表。需要以下标准SQL语句来处理图5的1NF表,以生成如图6所示的报告:
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")
);
答案 0 :(得分:1)
我会继续回答我自己的问题,同时追求IBM's UniVerse SQL Administration for DBAs我在第55页遇到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
和MV
的问题的第二部分,我对于我的生活无法弄清楚IBM从何处获得这种语法。我相信这是虚构的。我无法访问我可以使用的开发机器来测试它,但我在旧的10.1或新的UniVerse 10.3 SQL Reference
旁注 5R
和5L
意味着左右对齐5个字符。这是表元数据中内置的显示功能... Google for UniVerse FORMAT(或FMT)获取更多信息。
答案 1 :(得分:1)
您知道,Attribute,Multivalue和Sub-Multivalue来自他们构建数据的方式。
基本上,所有数据都存储在各种树中。 UniVerse是一个多值数据库。通常,它不像SQL工作函数的关系数据库那样工作。
每条记录都可以有多个属性。
每个属性都可以包含多个多值。
每个多值都可以有多个子多值。
所以,如果我有一个名为FRED的记录
然后,FRED< 1,2,3>指第一个属性,2个多值位置和3个子值位置。
要了解有关它的更多信息,您需要了解有关UniVerse如何工作的更多信息。 SQL部分只是它的一部分。我建议你阅读其他手册以了解你正在使用的是什么。
修改的
基本上,上面的代码告诉你:
每个客户可以 多个订单。这些存储在“表格”中的MV级别
每个订单可以 多个部分。它们存储在“表”中的MS级别
每个订单可能多个qtys。它们存储在“表”中的MS级别。因为它们处于同一水平,虽然它们的订单是1-n,但就零件来说它们是1-1。