web-dev-qa-db-ja.com

親関係の冗長なFKは非正規化ですか?

私がこのデータベースを持っているとしましょう

_client
| id | status |

sale
| id | client_id | date |

sale_item
| id | sale_id | *client_id* |
_

_*client_id*_列は冗長です。これは、_sale_item_行から参加してclientを取得できるためです。ただし、クライアントごとの売上をリストする必要がある場合は、そのJOINに費用がかかる可能性があります。

これは非正規化と見なされますか?それとも別の技術名がありますか?

私の理解では、_*client_id*_を維持するという決定は、スペースx速度に関するものです。 idは変更されず、削除もされないため、一般的な非正規化の例で発生する一貫性の問題はここでは当てはまりません(「削除」する必要がある場合は、status = 0に設定できます)。

2
rodorgas

はい、それは非正規化です。データベース内のある場所から別の場所(元の場所からデータを簡単に取得できる場所)にデータをコピーするときはいつでも、定義上、非正規化されます。

そして、パフォーマンスを改善することは、非正規化する完全に良い理由です。とはいえ、クライアントの数が非常に多い場合、またはclient_idは、通常必要となるsaleテーブルの唯一のデータであり、大きな問題にはなりません。非正規化のこの特定のインスタンス「カスケードキー構造」、またはその他の適切なものを引き起こすことは完全に合理的です。非正規化でもないという意味ではありません。

そして、一貫性の問題がないことに関して-決して決して言わないでください....

3
RDFozz