テクノロジー

それでも外部キー制約は必要ない / #fk_night でしゃべってきました

1: tomo_ari 2026/02/08 17:15

blogged

2: koyancya 2026/02/08 17:25

外部キー制約、正規化を使って設計する人にとっての強い味方って感じなので、そうでない人にとっては無用の長物というのは、それはそうって気がする

3: nguyen-oi 2026/02/08 17:54

FK不要論は定期的に燃えるけど、実務で整合性ぶっ壊れた時の絶望を知ると外せなくなる

4: rck10 2026/02/08 18:09

"ACIDで言えば、A(原子性)D(持続性)には強く期待していますが、C(一貫性)は別の機構で守るべき" / 業務上の「整合性」とRDBの「整合性」にはギャップがあって不便だよね、という意味では同意。

5: prograti 2026/02/08 18:17

システムを保守していると外部キー制約違反のバグとかよく遭遇するし、業務システムだとテーブル数が数百とかあって色んな人がスポットで保守に関わるから、個人的には制約付けた方が良いんじゃないかと思います

6: ty356trt5 2026/02/08 19:05

個人的には理解できる。薦めるかというとうーん

7: yarumato 2026/02/08 19:20

“外部キー制約は運用上の障壁(スキーマの変更を阻害する、パーティショニングできなくなる)になるだけでなく、整合性を守る仕組みとしては力不足すぎる。不変条件はアプリ側に寄せるほうが合理的。”

8: nippondanji 2026/02/08 19:33

リレーショナルモデルが力不足って、リレーショナルモデルを理解してないだけではなかろうか。

9: sgo2 2026/02/08 19:46

型やテストと違って本番環境にも確実に影響が出る、と考えると理解/説明し易いかも。

10: Chisei 2026/02/08 19:55

ルールベースの運用は守らない者が現れた時にダメージがでかいので制約ベースが安全です。

11: dorapon2000 2026/02/08 20:18

“単に運用がつらいから制約を弱めようという話をしているのではなくて、システム全体のことを考えたらアプリに不変条件を記述することになるし、そのとき外部キー制約の出番はないよね、という風にご理解いただけ”

12: Shinwiki 2026/02/08 20:24

webのバックエンドにある時の相性の話?

13: Ep7TUEiW 2026/02/08 20:25

多層防御というか多層障害発生対策は全然ありで、コスパも良い方かなと思う。コストには速度低減も含めたうえで

14: fusionstar 2026/02/08 20:35

データベース設計でシステム全体の整合性は保てないはわかるけど、アプリの条件がどうあれ外部結合の整合性は守られないと怖いよね。 アプリケーション層とデータ層の話を混ぜ返しているように見える。

15: kabochatori 2026/02/08 20:41

設計上では必要でも実務では邪魔に感じてしまう。そんな外部キー制約。

16: sirobu 2026/02/08 20:58

そのテーブル群を使って開発してるのが一つのチーム、一つのアプリ群ならそうかもしれないっすね

17: soxandcity 2026/02/08 21:00

クリーンアーキテクチャとかではそうだよね。DBを気にしてモデリングなんてしないからな。

18: hasiduki 2026/02/08 21:01

DB制約がドメイン制約として不十分なのは同意!!!!!!でも!!!!両方あってもいいよね!!!!!!

19: baronhorse 2026/02/08 21:03

アプリ通さないこともあるしバグもあり得るからな。のり代程度でも入れといた方が良い

20: degucho 2026/02/08 21:11

テストデータ作りにくいんよな

21: tsimo 2026/02/08 21:49

外部キー制約サポートがなかった時代からの古株のRailsユーザーが言いそう。

22: gabill 2026/02/08 22:01

sqlはStructured Query Languageの略で、queryは質問、疑問、問い合わせといった意味。つまりReadに特化した言語。Writeに特化したspl(Structured Post Language)を作ろう。

23: ryudenx 2026/02/08 22:15

削除するときに外部制約があるとかなりめんどい

24: revert 2026/02/08 22:17

こういう人が必要としているのはRDBではないのだろうな

25: ed_v3 2026/02/08 22:43

まぁチームで認識あってればどっちでもいんじゃね。

26: kagehiens 2026/02/08 22:44

外部キー制約は面倒は確実に発生するのに、それによって守れるものがどの程度あるかというと、うーん、だからなぁ……。

27: MZQ 2026/02/08 22:51

この手の意見の不一致ってシステムの種類、規模、状況次第で、そこを揃えない議論は無意味 。業務システムならバッチでどうとでもなるし、C向けシステムみたいに大量のリードや更新を同期処理するなら無理だろう。

28: taguch1 2026/02/08 22:58

ソフトウェアはバグるから絶対に壊れたデータは入ってくる。それを抱えたまま運用するのって長いことソフトウェアエンジニアやってもしんどい。それが少なくなるなら多少のめんどくささは許容する。

29: dekasasaki 2026/02/08 23:25

“より悪いことに、保証が極めて弱いことで知られる "インターネット" を通してやりとりすることになります。” ???

30: dodefeg 2026/02/08 23:28

「address = null のユーザーは商品を注文できない」は「DDLの制約」として表現可能なトリガで保証できます。なおアプリ側に集中させてDB側を単純化する、という考え方があり得ること自体は理解します。

31: door-s-dev 2026/02/08 23:35

ON DELETE CASCADEとかは使わないってことなのか

32: mkusaka 2026/02/08 23:56

外部キー制約は運用負担で整合性表現が弱く、DDL(CREATE TABLE)やMySQLではStripe等の分散ケースを守れないため、アプリに不変条件をエンコードすべきと論じます。

33: rryu 2026/02/09 01:30

外部キー制約を付けるとデータのストア順に制約が付くのだが、一括操作系のツールがそれに対応していないとハマるという。で、それで得られる利点は外部キーがあればその先もあるという保証だけなのが…

34: yosio_ism 2026/02/09 01:42

すべてを外部制約で解決できないからって、外部制約が要らないことにはならないんじゃないかな

35: onesplat 2026/02/09 04:32

all or nothingではないはずのものを「益がない」などと断定してしまうところがダメなのではないだろうか。益がないはずはないんだよね、トレードオフなだけで

36: sionsou 2026/02/09 06:12

登壇内容を見てないのであまり強いことは言えないし、少なくとも自分より優秀な人なのでそれなりの運用や意図があってやってることはわかるけど…それでも外部キー制約は必要だと俺は思う。運用次第なのかなぁ

37: monokoto01 2026/02/09 06:40

外部キーの役割は、アプリ側で実装するのが良いよね

38: versatile 2026/02/09 07:11

支持します。FKは人類にはまだはやい。DBはもうそろそろ自由に羽ばたけ。リレーショナルから解放されろ。もう30年以上まえからオブジェクトDBとかあるのになぁ

39: tettekete37564 2026/02/09 07:40

PHPer臭い

40: devrabi 2026/02/09 07:52

外部キーが完全ではないからと言って、存在するメリットを大きく上回るデメリットがない限り、受け入れて利用するだけでしょう

41: jojo800 2026/02/09 08:17

mysqlでマルチテナントの場合、異なるテナントに紐づくのはアプリで整合性担保しないといけないので気休め程度にしかならんのでは。とは思う。けどまぁ必要ない。とは思わないかな。

42: MtAsuka 2026/02/09 08:20

外部キーはとりあえずDB定義見ただけで理解できるメタデータ定義でもあるので複雑なシステムなら必須だと思う。アプリで定義した制約は簡単に見れないでしょ?

43: sechs 2026/02/09 08:37

人間が間違えないなら必要ない機能。外部キーを使うことで増加する計算コストを抑える何かがあればよい?

44: honeybe 2026/02/09 08:56

キー制約が最後のガードになるからある方が良い派

45: secseek 2026/02/09 09:01

LinuxにRustはいらないってのと似てますね。それで問題ないなら確かにいらないんでしょう。実際、Linuxほど複雑な問題は世の中にそうはないので、大抵はあんな厳しい制約はいらないのかも

46: PrivateIntMain 2026/02/09 09:08

ふつうDBはDBの世界だけで完結しているべきでアプリの都合なんか関係無いはずなのだけど、往々にして密結合になっているしアプリのデータの入れ物としてしかDBを使わないなら外部キー制約は邪魔って話かしら。

47: ihirokyx 2026/02/09 09:22

外部キー制約は運用上の障壁になるだけでなく整合性を守る仕組みとしては力不足すぎる システム全体のことを考えたとき、不変条件はアプリケーションにエンコードせざるを得ないのだからそちらに寄せるほうが合理的

48: Error401 2026/02/09 09:38

そして、find_and_delete_orphan_data.shなんかを作って、cronで回す羽目になる

49: da-yoshi 2026/02/09 10:09

データ整合性が壊れたまま運用続けてスキーマが腐れているシステムの運用保守をやったことがあるかどうかで意見が異なる気がしている

50: auto_chan 2026/02/09 10:30

「制約はアプリの責務」って考え方には共感。DBでも担保しておくのはアリだけど二重管理だし、開発中にテーブル作り直したり関心のあるテーブルにだけ雑なデータ入れようと思ったら制約にかかったり発狂しがち

51: aike 2026/02/09 10:43

仕組みとしては良いんだけど、もっと迅速に参照・操作できる標準的なGUI/CUIがあればいいなとは思う。整合性はトランザクションで保証するというのは全面的に賛成ではないけど経験的な実感としては一理ある。

52: ka-ka_xyz 2026/02/09 12:21

アプリコード側の厳密性をそこまで信頼できる?って言われると、自分は無理。(ゴンドラ作業するときに、「安全確保はゴンドラ側の責務でありフルハーネスは二重管理で無駄」とか言わないじゃん

53: kiririmode 2026/02/11 12:35

“システム全体のことを考えたらアプリに不変条件を記述することになるし、そのとき外部キー制約の出番はないよね”