参照整合制約(外部キー制約)とGeneXus
GeneXusがデータベースを作成する際、
デフォルトだと参照整合制約(外部キー制約)も生成しますが、
あくまでもデフォルトであり、プロパティで変更することができます。
データストアのプロパティで[Declare referential integrity]がYesだと生成します。
Noだと生成しません。
※但し、初回に設定しておくか、Noにした後に「DBの再編成」を行う必要があります。
Declare referential integrity property
https://wiki.genexus.com/commwiki/servlet/wiki?9093,Declare+referential+integrity+property,
「参照整合制約」があるとどうなるか、ですが。
1)データ移行や、テストデータ作成時にDB構造を考慮する必要がある
親子関係の場合、子のデータを先に作ることができません。
親のデータを削除することができません。
トランとマスタの関係の場合も同じで、マスタが無いとエラーになります。
これは結構大変です。
GeneXusはアジャイル開発で進めることが多いですので、
テーブル構造が固まってないタイミングでもプロトタイプをガンガン作っていきます。
その際に、テストデータを用意するのに、
DB構造を踏まえてデータの投入や作成をするのは面倒ですし、
あまりDBに詳しくないメンバーがいた場合、
エラーの内容が理解できずに時間を浪費してしまうこともあるでしょう。
2)DB再編成時に失敗する
これはGeneXus特有で、少々困った事象ですが、
DBを再編成する際にGeneXusはデータも移行しようとします。
機能自体は非常に有益です。
テストデータをなるべく残してくれるので助かります。
ただ、適当なテストデータが入っていて、「参照整合制約」がある状態だと
DB再編成時に失敗して、生成し直しになってしまうことが割とあります。
3)テーブル同士の関連で不整合なデータが生成されない
親子関係、マスタとトランの関係をDBが管理しますので、
もし、システムの仕様が誤っていたとしても、DB側がエラーを出します。
ですので、確実にデータの整合性が管理されます。
そもそもGeneXusに関わらず、「参照整合制約」をつけるかどうかは、DB界隈で話題になる内容です。
私の経験上「DBが好きな人」はつけるべきと言う傾向がありますね。
ここまでを踏まえて、[Declare referential integrity]プロパティをどうするべきかですが、
私は「No」で良いと思います。
参照整合制約は仕様で管理すれば良く、DB上の制約としてつける必要は無い。
つけた場合にはデータ移行・メンテ・テスト時に面倒なこと(効率悪)が起きますし、
レスポンスもほぼ変わら無いでしょうが、制約があるよりは無いほうが早いのかなと思います。
どうしてもつけたい場合は、
・結合テスト以降に、テスト環境・本番環境に対してだけ付ける。
・開発時にはつけない。データ移行時も外す。
という形が良いかと思います。
が、それでも保守時にデータ変更などあれば、影響も受けますので、
やはり無いほうが良いと思います。
デフォルトだと参照整合制約(外部キー制約)も生成しますが、
あくまでもデフォルトであり、プロパティで変更することができます。
データストアのプロパティで[Declare referential integrity]がYesだと生成します。
Noだと生成しません。
※但し、初回に設定しておくか、Noにした後に「DBの再編成」を行う必要があります。
Declare referential integrity property
https://wiki.genexus.com/commwiki/servlet/wiki?9093,Declare+referential+integrity+property,
「参照整合制約」があるとどうなるか、ですが。
1)データ移行や、テストデータ作成時にDB構造を考慮する必要がある
親子関係の場合、子のデータを先に作ることができません。
親のデータを削除することができません。
トランとマスタの関係の場合も同じで、マスタが無いとエラーになります。
これは結構大変です。
GeneXusはアジャイル開発で進めることが多いですので、
テーブル構造が固まってないタイミングでもプロトタイプをガンガン作っていきます。
その際に、テストデータを用意するのに、
DB構造を踏まえてデータの投入や作成をするのは面倒ですし、
あまりDBに詳しくないメンバーがいた場合、
エラーの内容が理解できずに時間を浪費してしまうこともあるでしょう。
2)DB再編成時に失敗する
これはGeneXus特有で、少々困った事象ですが、
DBを再編成する際にGeneXusはデータも移行しようとします。
機能自体は非常に有益です。
テストデータをなるべく残してくれるので助かります。
ただ、適当なテストデータが入っていて、「参照整合制約」がある状態だと
DB再編成時に失敗して、生成し直しになってしまうことが割とあります。
3)テーブル同士の関連で不整合なデータが生成されない
親子関係、マスタとトランの関係をDBが管理しますので、
もし、システムの仕様が誤っていたとしても、DB側がエラーを出します。
ですので、確実にデータの整合性が管理されます。
そもそもGeneXusに関わらず、「参照整合制約」をつけるかどうかは、DB界隈で話題になる内容です。
私の経験上「DBが好きな人」はつけるべきと言う傾向がありますね。
ここまでを踏まえて、[Declare referential integrity]プロパティをどうするべきかですが、
私は「No」で良いと思います。
参照整合制約は仕様で管理すれば良く、DB上の制約としてつける必要は無い。
つけた場合にはデータ移行・メンテ・テスト時に面倒なこと(効率悪)が起きますし、
レスポンスもほぼ変わら無いでしょうが、制約があるよりは無いほうが早いのかなと思います。
どうしてもつけたい場合は、
・結合テスト以降に、テスト環境・本番環境に対してだけ付ける。
・開発時にはつけない。データ移行時も外す。
という形が良いかと思います。
が、それでも保守時にデータ変更などあれば、影響も受けますので、
やはり無いほうが良いと思います。
コメント
コメントを投稿