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

私の使用では、これは目立った速度低下もなく問題なく動作します。しかし、大規模な環境では、キー付きの関係がないと、これらのトランザクションの速度が低下する可能性があります。また、ディビジョンを削除した場合、参照整合性を維持することがより困難になります。

実際に2つの値の関数である外部キーを持つ方法はありますか? この特定の問題は、私の会社の 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 に答える