基于按位运算的DB2外键

时间:2013-08-29 04:15:56

标签: sql db2 ibm-midrange

前段时间,我为我目前工作的公司创建了一个自定义CMS。我们公司有多个部门,每个部门都要考虑到。与A部门合作的人只能访问被认为适合他们的文件。 B部门也是如此。有些文件可以用于两个部门。我想避免大多数重复记录,因此,我没有在分区A中记录特定文档的记录,而是基本上是分区B的相同记录,而是使用逐位AND操作来处理请求。

相关表格信息如下:

DOCUMENT Table
ID       NAME             DIVISIONS
-----------------------------------
1        Document 1       3
2        Document 2       2
3        Document 3       1

DIVISIONS Table
ID       DIVISION
-------------------
1        DIVISION A
2        DIVISION B

以下查询:

SELECT A.NAME, B.DIVISION 
FROM DOCUMENT AS A 
LEFT OUTER JOIN DIVISIONS AS B ON LAND(A.DIVISIONS,B.ID)=B.ID 
WHERE B.DIVISION='DIVISION A'

将生成结果集:

NAME         DIVISION
------------------------
Document 1   DIVISION A
Document 3   DIVISION A

以及B.DIVISION ='DIVISION B'时的以下结果集

NAME         DIVISION
------------------------
Document 1   DIVISION B
Document 2   DIVISION B

对于我的用途,这种方法很好,没有明显的减速。但在更大的环境中,缺乏关键关系可能会损害这些交易的速度。而且,在我们放弃一个部门的机会中保持参照完整性变得更加困难。

有没有办法让外键实际上是两个值的函数?虽然这个特殊问题与我公司的iSeries(AS400)和iSeries的DB2有关,但它确实是一个可以为任何DBMS解决的问题。提前谢谢。

2 个答案:

答案 0 :(得分:5)

Mu 所评论 - 关联表是正确的设计。

DOCUMENT_DIVISIONS Table
ID    DOCUMENT_ID    DIVISION_ID
--------------------------------
1     1              1
2     1              2
3     2              2
4     3              1

然后,这只是通过协会加入文件和分工的问题:

SELECT A.NAME, C.DIVISION 
FROM DOCUMENT AS A
JOIN DOCUMENT_DIVISIONS AS B ON A.ID = B.DOCUMENT_ID
JOIN DIVISIONS AS C ON C.ID = B.DIVISION_ID
WHERE C.DIVISION = 'DIVISION A'

答案 1 :(得分:0)

当然,在外键约束中可以有多个列,下图显示了多个列名。

Db2 Basics Constraints

constraint diagram

我总是在AS400上使用约束类型的限制,这样数据不会自行更改或神奇地级联删除。您只是得到一个错误,就像您在一个唯一的文件中插入一个重复的记录。由于“R”PG限制,您可以在as400上轻松记住这一点。