次のようなテーブル Document があるとします。
_______________________
| Document |
|-----------------------|
| DocumentId int PK |
| (add't fields) |
|_______________________|
次に、2 番目のテーブルがあるとします。
_______________________
| DocumentVersion |
|-----------------------|
| DocumentId int PK, FK |
| VersionId int PK |
| (add't fields) |
|_______________________|
最後に、DocumentVersion を参照する 3 番目のテーブルを作成したいとします。おそらく、各バージョンにアクセスしたユーザーの監査です (User テーブルが存在すると仮定します)。
_______________________
| VersionAccessLog |
|-----------------------|
| DocumentId int PK, FK |
| VersionId int PK, FK |
| UserId int PK, FK |
| AccessTime DateTime PK|
|_______________________|
最良の例ではないかもしれませんが、うまくいけば私の質問を説明するのに十分です。
VersionAccessLogに注目すると、次のようになります。
- PK(DocumentId、VersionId、UserId、AccessTime)
- FK(DocumentId, VersionId) REFERENCES DocumentVersion
- FK(userId) リファレンス ユーザー
ここで私の質問は、VersionAccessLog でFK(DocumentId)を作成する必要があるかどうかです。一見すると、キーは不必要に見えます。参照整合性は、DocumentVersion への FK によって強制されます。しかし、関係代数の観点からすると、この鍵は存在するべきでしょうか? 実用的な観点から (必要に応じて SQL Server 2012 を想定)、キーを含めたり除外したりすることによるパフォーマンスへの影響はありますか?