2

前段时间,我为我目前工作的公司创建了一个自定义 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 都可以回答的问题。提前致谢。

4

2 回答 2

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'
于 2013-08-29T05:12:23.013 回答
0

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

Db2 基础约束

约束图

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

于 2013-09-11T18:17:00.303 回答