6

レガシーデータベースを調べたところ、列をそれ自体に参照するいくつかの外部キーが見つかりました。参照列は主キー列です。

ALTER TABLE [SchemaName].[TableName]  WITH CHECK ADD  
CONSTRAINT [FK_TableName_TableName] FOREIGN KEY([Id])
REFERENCES [SchemaName].[TableName] ([Id])

その意味は何ですか?

4

2 に答える 2

15
ALTER TABLE [SchemaName].[TableName]  WITH CHECK ADD  
CONSTRAINT [FK_TableName_TableName] FOREIGN KEY([Id])
REFERENCES [SchemaName].[TableName] ([Id])

この外部キーは完全に冗長であり、削除するだけで無意味です。行が制約を検証してそれ自体に一致するため、違反することはありません。

階層テーブルでは、関係は 2 つの異なる列の間になります (例:IdParentId) 。

オブジェクトエクスプローラーで「キー」ノードを右クリックして「新しい外部キー」を選択し、作成された外部キーを削除せずにダイアログボックスを閉じてから、いくつかを作成すると、ビジュアルデザイナーを使用して作成された可能性が非常に高い理由について開いているテーブル デザイナーで他の変更を加えて保存すると、この種の冗長な制約が作成されます。

于 2012-11-11T12:16:23.403 に答える
-7

場合によっては、これがモデルの冗長性を減らすための推奨される方法です。自己参照外部キーを使用すると(例に示すように)、テーブル内の行間に階層関係を作成します。テーブルから行を削除するとどうなるかに注意してください。削除時にカスケードすると、まだ必要な行が削除される可能性があります。これらの種類のキーを使用すると、これをプログラム/プログラマーの責任にするのではなく、データ検証の一部を DB モデルに移します。一部の衣装は、この方法を好みます。私は、プログラムとプログラマーが責任を負うようにしたいと考えています。データ モデルは、本番環境でのリファクタリングとアップグレードが難しい場合があります。

于 2012-11-11T12:09:34.530 に答える