A5:SQL Mk-2

開発のこと、日々のこと

DDL生成時の外部キー制約の出力順序

ホーム フォーラム A5:SQL Mk-2掲示板 DDL生成時の外部キー制約の出力順序

  • このトピックには12件の返信、1人の参加者があり、最後にhurricaneにより1年、 3ヶ月前に更新されました。
13件の投稿を表示中 - 1 - 13件目 (全13件中)
  • 投稿者
    投稿
  • #17133 返信
    hurricane
    ゲスト

    いつも大変便利に使用させていただいております。
    新規 > ER図 よりER図を作成し、DDLを生成する際に、外部キー制約の出力順序がまちまちになるのですが、何かしらの方法で常に同じ順序で出力することは不可能でしょうか?

    ◆バージョン
    2.16.1(x64 edition)

    ◆操作
    ER図 > DDLを作成する


    RDBMS種類:PostgreSQL
    テーブル生成順序:依存関係順(依存する方が先)
    リレーションシップからファイブキー制約を作成する:true
    外部キー名:%0:s_FK%1:d

    ◆ある時の外部キー制約出力順序
    ALTER TABLE “public”.”test”
    ADD CONSTRAINT “test_FK1” FOREIGN KEY (“member_id”) REFERENCES “public”.”member”(“id”);

    ALTER TABLE “public”.”test”
    ADD CONSTRAINT “test_FK2” FOREIGN KEY (“team_id”) REFERENCES “public”.”team”(“id”);

    ◆またある時の外部キー制約出力順序
    ALTER TABLE “public”.”test”
    ADD CONSTRAINT “test_FK1” FOREIGN KEY (“team_id”) REFERENCES “public”.”team”(“id”);

    ALTER TABLE “public”.”test”
    ADD CONSTRAINT “test_FK2” FOREIGN KEY (“member_id”) REFERENCES “public”.”member”(“id”);

    #17251 返信
    松原正和
    キーマスター

    hurricane さんこんにちは。
     
    基本的に外部キーの生成順序は、単に内部的に持っているオブジェクトの配列の順序で生成されます。
    (実質的には、描画時に手前になる方あるいは、後からおいた方が先にDDLに出力されます。)

    #17943 返信
    hurricane
    ゲスト

    ご返答ありがとうございます。

    外部キー制約の生成順序に関する規則性については、理解いたしました。
    しかしながら、次のようなストーリーで問題が発生します。

    1.ER図を作成し、DDLバージョン1として出力する。
    2.ER図を編集し、DDLバージョン2として出力する。

    このとき、2の編集ではテーブルを追加したのみです。
    ですが、関係ないテーブルの外部キーの出力順が変わってしまいます。
    (内部的に持っているオブジェクトの配列順序がなぜ変わってしまっているのか不明)

    これにより、バージョン1で作成したDBをバージョン2へ更新する差分変更SQLに、本来は不要な外部キー制約の名前の付け替えが発生してしまいます。

    できればアルファベット順等で生成できるようになるか、あるいはせめて内部的に持っているオブジェクトの配列順序を一覧表示し、好みの順序に並び変えれるようにはできませんでしょうか。

    何卒ご検討よろしくお願いいたします。

    #17946 返信
    hurricane
    ゲスト

    補足いたします。
    エンティティの物理名を変更した際に順序が大きく崩れるようです。

    例えば、あるテーブル(他テーブルとのリレーション無し)のエンティティを複製した場合、「NEW_ENTITY1」という名前で追加されますが、この時点ではDDL出力しても正常にテーブル追加分しか差分が発生しません。

    ところがこの「NEW_ENTITY1」を「test」などに物理名を変更した後にDDL出力を行うと、大量の外部キー制約の差分が発生します。

    ※前述の通り、たしかに、外部キー制約のテーブルごとの出力順は一定です。しかし、一つのテーブルごとの「”tbl1_FK1″」「”tbl1_FK2″」「”tbl1_FK3″」等の出力順が滅茶苦茶になります。

    #17948 返信
    hurricane
    ゲスト

    何度も連投してしまい申し訳ありません。


    CONSTRAINT “tbl1_FK1” FOREIGN KEY (“member_id”) REFERENCES “member”(“id”);
    CONSTRAINT “tbl1_FK2” FOREIGN KEY (“team_id”) REFERENCES “team”(“id”);
    CONSTRAINT “tbl2_FK1” FOREIGN KEY (“user_id”) REFERENCES “user”(“id”);

    ↑が↓のようになることはないが

    CONSTRAINT “tbl2_FK1” FOREIGN KEY (“user_id”) REFERENCES “user”(“id”);
    CONSTRAINT “tbl1_FK1” FOREIGN KEY (“member_id”) REFERENCES “member”(“id”);
    CONSTRAINT “tbl1_FK2” FOREIGN KEY (“team_id”) REFERENCES “team”(“id”);

    #17949 返信
    hurricane
    ゲスト


    CONSTRAINT “tbl1_FK1” FOREIGN KEY (“member_id”) REFERENCES “member”(“id”);
    CONSTRAINT “tbl1_FK2” FOREIGN KEY (“team_id”) REFERENCES “team”(“id”);
    CONSTRAINT “tbl2_FK1” FOREIGN KEY (“user_id”) REFERENCES “user”(“id”);

    ↑が↓のようになってしまい、DDLに大量の差分が発生してしまいます。

    CONSTRAINT “tbl1_FK1” FOREIGN KEY (“team_id”) REFERENCES “team”(“id”);
    CONSTRAINT “tbl1_FK2” FOREIGN KEY (“member_id”) REFERENCES “member”(“id”);
    CONSTRAINT “tbl2_FK2” FOREIGN KEY (“user_id”) REFERENCES “user”(“id”);

    こちらは不具合なような気がするのですが、いかがでしょうか。
    大変お忙しいところご迷惑おかけしますがご確認をよろしくお願いいたします。

    #17972 返信
    hurricane
    ゲスト

    何度も連投してしまい大変申し訳ありません。

    気が付いたのですが、「外部キーの出力順」というよりは、「外部キーの連番の採番順」という方が表現が正しいですね。

    外部キー名「%0:s_FK%1:d」(%0:sはテーブル名、%1:dは連番)

    という仕様において、連番の採番順が一意ではないようです。

    #18181 返信
    松原正和
    キーマスター

    hurricane さんこんにちは。
     
    同じテーブル内でのFKの順序ということでしょうか? ちょっと今週末はそこまで手が付けられなかったので、もう少々お待ちください。

    #18196 返信
    hurricane
    ゲスト

    松原さんこんにちは

    > 同じテーブル内でのFKの順序ということでしょうか?

    仰る通りです。

    > ちょっと今週末はそこまで手が付けられなかったので、もう少々お待ちください。

    はい、ありがとうございます。よろしくお願いします。

    #18414 返信
    松原正和
    キーマスター

    hurricane さんこんにちは。
     
    現状、外部キーのDDLはER図の配置順に出力されます。手前側に配置されたリレーションシップから先に外部キーとして出力されます。
     
    なので、リレーションシップの線の順序を変えなければ外部キーの出力順序も変わらないはずです。

    #18471 返信
    hurricane
    ゲスト

    お返事ありがとうございます。

    「.a5m2」ファイルをテキストエディタで開きZOrder等も確認しましたが、やはりどうしても配置に関わらず外部キー出力順が変わっていると思われるので、再現できるa5m2プロジェクトファイルを用意しました。

    https://3.gigafile.nu/0127-c7cc3b7a7883f15258c7e5da398e944e1
    (ダウンロードキー:a5m2)

    A.Sample1.a5m2:テーブル追加前のプロジェクト
    B.sample1.sql:Aから出力したDDL
    C.Sample2.a5m2:テーブル追加後のプロジェクト
    D.sample2.sql:Cから出力したDDL

    AとCをWinMergeで比較すると、テーブル追加分の差分しか出ず、ZOrderも問題無いように見えますが、BとDを比較すると外部キー出力順に差が発生します。

    補足で、差分比較とDDL出力時の設定値の画像も同梱してあります。

    お忙しいところ申し訳ないですが確認していただけると嬉しいです。よろしくお願いいたします。

    #18811 返信
    松原正和
    キーマスター

    hurricane さんこんにちは。
     
    ありがとうございます。再現できました。DDLの生成を依存関係順にしていた時の並べ替えで、非安定なソートを使っていたために、DDLの生成順序に変化が起きてしまったようでした。親・子のテーブルが同じリレーションシップがあった場合、配置した順序で外部キーを生成するようにソートの比較関数を修正しました。
     
    Version 2.18.0 beta 40 で直しましたのでご確認いただければと思います。

    #18839 返信
    hurricane
    ゲスト

    あけましておめでとうございます。
    確認、修正ありがとうございました。

    beta40にて修正されていることを確認しました。
    ありがとうございました。

    本年もA5M2を応援しております!

13件の投稿を表示中 - 1 - 13件目 (全13件中)
返信先: DDL生成時の外部キー制約の出力順序
あなたの情報:




コメントは受け付けていません。