Ren*_*127 2 sql db2 ibm-midrange
前段时间,我为我目前工作的公司创建了一个自定义CMS.我们公司有多个部门,每个部门都要考虑到.与A部门合作的人只能访问被认为适合他们的文件.B部门也是如此.有些文件可以用于两个部门.我想避免的,这样而不是在一个部门一个特定的文档组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
Run Code Online (Sandbox Code Playgroud)
以下查询:
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'
Run Code Online (Sandbox Code Playgroud)
会产生结果集:
NAME DIVISION
------------------------
Document 1 DIVISION A
Document 3 DIVISION A
Run Code Online (Sandbox Code Playgroud)
同样,当B.DIVISION ='DIVISION B'时,以下结果集
NAME DIVISION
------------------------
Document 1 DIVISION B
Document 2 DIVISION B
Run Code Online (Sandbox Code Playgroud)
对于我的用途,这很好,没有明显的减速.但在更大的环境中,缺乏关键关系可能会损害这些交易的速度.而且,在我们放弃一个部门的机会中保持参照完整性变得更加困难.
有没有办法让外键实际上是两个值的函数?虽然这个特殊问题与我公司的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
Run Code Online (Sandbox Code Playgroud)
然后,这只是通过协会加入文档和部门的问题:
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'
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
135 次 |
| 最近记录: |