萌えハッカーニュースリーダー

2025/07/15 11:36 How to Get Foreign Keys Horribly Wrong

出典: https://hakibenita.com/django-foreign-keys
hakase
博士

やあ、ロボ子!今日のITニュースは、データベースのForeign Key制約についてじゃ。

roboko
ロボ子

Foreign Key制約ですか。システムの整合性を保つために重要ですよね。

hakase
博士

そうじゃ!記事によると、Foreign Key制約はシステムの整合性を保ち、予期せぬ問題を未然に防ぐために不可欠らしいぞ。

roboko
ロボ子

なるほど。それから、`unique_together`は非推奨で、`UniqueConstraint`の使用が推奨されているんですね。

hakase
博士

`unique_together`は柔軟性に欠けるからの。`UniqueConstraint`の方が、B-Treeインデックスの高度な機能も使えるし、より良い選択じゃ。

roboko
ロボ子

重複インデックスの特定も重要ですね。`ForeignKey`はデフォルトでインデックスを作成するとのことですが、`db_index=False`で無効化できるんですね。

hakase
博士

そうそう。でも、`db_index=False`を設定した時に、Djangoが制約を再作成してロックを引き起こす可能性があるから注意が必要じゃ。SQLを確認して、`SeparateDatabaseAndState`で制御するんじゃ。

roboko
ロボ子

`SeparateDatabaseAndState`ですか。データベース操作と状態操作を分離するんですね。`RunSQL`でインデックス削除SQLを実行すると。

hakase
博士

その通り!移行操作には常に逆操作を提供することも忘れちゃいかんぞ。`RunSQL`の第2引数に逆操作SQLを指定するんじゃ。

roboko
ロボ子

同時インデックス操作には、`DROP INDEX CONCURRENTLY`を使用するんですね。テーブルロックを回避するために。

hakase
博士

`atomic=False`で非アトミックな移行にするのもポイントじゃ。ForeignKeyのインデックスは、削除時の関連オブジェクト検証に利用されるから、`db_index`を明示的に設定してコメントを追加すると良いぞ。

roboko
ロボ子

NULL値が多いカラムには、部分インデックスを使用するんですね。`WHERE`句で条件を指定して。

hakase
博士

そうじゃ!PostgreSQLでは`AddIndexConcurrently`と`RemoveIndexConcurrently`が使えるから、組み込みの同時インデックス操作を利用すると良いぞ。

roboko
ロボ子

移行操作の順序も重要ですね。実行中のアプリケーションへの影響を軽減するために調整するんですね。

hakase
博士

`select_for_update`は参照テーブルもロックするから、`select_for_update(of=('self',))`でロック範囲を限定するんじゃ。`select_for_update(no_key=True)`で、より寛容なロックを取得することもできるぞ。

roboko
ロボ子

勉強になります!データベースの移行は奥が深いですね。

hakase
博士

じゃろ?最後に一つ。データベースの移行で一番怖いのは、移行中にコーヒーをこぼしてキーボードがショートすることじゃ!

roboko
ロボ子

それはシステム全体が停止してしまいますね!

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search