採用するアーキテクチャに依存すると思うので、自分はどっちでも良い派です。
私はRails使いなので、Rails前提で話をさせてもらいますが、
方法Bであっても、
方法Bを採用した場合
- テーブルAにレコード登録(p_keyとして'hoge'が採番される)
- テーブルAからp_key"hoge"を取得
- テーブルBにレコード登録(f_keyに2.で取得した"hoge"をセット)
となり、p_key"hoge"を取得するための余計なDB通信が生じる。
という事にはなりません。
Railsの場合、
ruby
1# AとかBだと具体例が難しいので、usersとpostsにさせてもらいます
2
3class User < ApplicationRecord
4 has_many :posts
5end
6
7# postsテーブル
8# user_idを持つ
9class Post < ApplicationRecord
10 belongs_to :user
11end
12
13# 仮にユーザー作成と投稿のレコードを同時に作成するとする
14ActiveRecord::Base.transaction do
15 user = User.create!(ユーザー登録に必要なパラメーター)
16 post = Post.create!(user: user, title: "タイトル", "content": "本文", ...)
17end
テーブルA=users、テーブルB=postsとします。
Raillsの都合上p_keyは整数の連番ですが。
(1) テーブルAにレコード登録(p_keyとして'hoge'が採番される)。
戻り値としてレコードのオブジェクトが取得でき、当然p_keyのhogeも取得できている。
(2) テーブルBにレコード登録(f_keyに1.で取得した"hoge"をセット)
という事が簡単にできます。
従いまして、使用するフレームワークによって方法Bでも方法Aとまったく変わらない効率で処理ができます。
違いが出てくるのは、DDDを採用するモバイルアプリなどの場合です。ウェブアプリでも良いですが、
フロント(モバイル or ウェブ)とAPI(RESTなど)が明確に分離されている場合かつ、DDDの場合、
フロントでIDを発行するほうが自然なケースが多いと思います。
理想は、例えばUserRepository#Saveで新規でも更新でも保存できるべきところを、
サーバーサイドでのID発行となると、UserRepository#Createと、UserRepository#Saveの2つのケースに分けなくてはいけないなどDDDの文脈で違和感が出てくるという感じはします。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。