sql - 基于位运算的 DB2 外键

标签 sql db2 ibm-midrange

前段时间,我为我目前工作的公司创建了一个自定义 CMS。我们公司有多个部门,每个部门都必须负责。在 A 部门工作的人员只能访问被认为适合他们的文件。 B部门也是如此。一些文件可以在两个部门使用。不过,我想避免大部分重复记录,这样我就可以使用按位 AND 运算来处理请求,而不是在 A 部分有一个特定文档的记录,而在 B 部分有一个基本相同的记录。

相关表信息如下:

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 来说,这确实是一个可以回答的问题。提前致谢。

最佳答案

正如 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'

关于sql - 基于位运算的 DB2 外键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18502177/

相关文章:

sql - 从 SQL Server 表中检索缩写

c - 在多进程系统中使用 SQLAllocHandle(SQL_HANDLE_ENV, ...)

db2 - 连接到 db2 时出错

ibm-midrange - CPYTOIMPF 到 qtemp 是否比到其他库更快?

java - 从 RPGLE (as400) 调用 java 方法

mysql - 在多行中选择过去两年

sql - 如何根据日期获得确切年龄

sql - 一行平均值的平均值

hibernate - 我可以以某种方式将 JHipster 微服务应用程序与 DB2 一起使用吗

将 ODBC 转到 iSeries : SQL0104 - Message can not be translated successfully