質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

意見交換

クローズ

5回答

1145閲覧

IDはプログラム側 or DB側のどちらで採番すべきか

carfun_engineer

総合スコア0

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

0グッド

1クリップ

投稿2024/07/23 15:10

0

1

テーマ、知りたいこと

DBにINSERTする際、DB側でID(連番やUUID)を採番することも可能だが、

  • 方法A:プログラム側でIDを採番し、DBに登録すべきか
  • 方法B:DB側でIDを採番すべきか

皆様のご意見を伺いたい。
自分は方法A派。

背景、状況

以下のような処理を書きたい状況
--- ここから ---
テーブルAにレコード登録(p_keyは'hoge')
テーブルBにレコード登録(f_keyに"hoge"をセット)
--- ここまで ---

方法Aを採用した場合、

  1. プログラムでID("hoge")を採番
  2. テーブルAにレコード登録(p_keyに'hoge'をセット)
  3. テーブルBにレコード登録(f_keyに"hoge"をセット)

となり違和感がない。

方法Bを採用した場合

  1. テーブルAにレコード登録(p_keyとして'hoge'が採番される)
  2. テーブルAからp_key"hoge"を取得
  3. テーブルBにレコード登録(f_keyに2.で取得した"hoge"をセット)

となり、p_key"hoge"を取得するための余計なDB通信が生じる。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

回答5

#1

mingos

総合スコア4190

投稿2024/07/23 16:52

採用するアーキテクチャに依存すると思うので、自分はどっちでも良い派です。
私はRails使いなので、Rails前提で話をさせてもらいますが、
方法Bであっても、

方法Bを採用した場合

  1. テーブルAにレコード登録(p_keyとして'hoge'が採番される)
  2. テーブルAからp_key"hoge"を取得
  3. テーブル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の文脈で違和感が出てくるという感じはします。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

#2

退会済みユーザー

退会済みユーザー

総合スコア0

投稿2024/07/23 23:36

AUTO INCREMENTならDB、UUIDならプログラム。

フレームワークの普通の使い方に従うだけで自分で決める部分ではない。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

#3

maisumakun

総合スコア145932

投稿2024/07/24 00:42

p_keyは'hoge'

番号やUUIDでもない、特殊なキーの形を使用する必要がある状況、ということでしょうか?

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

#4

yambejp

総合スコア116468

投稿2024/07/24 01:19

意味のあるキーであれば運用側できめます(例えばマスターデータのコードなど)
意味のないキーであればdbのauto_incrementなどで対応します

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

#5

1121

総合スコア17

投稿2024/07/24 09:19

どっちでもいいかなぁ
自分で好き勝手DB設計するならb一択※ただし小規模
大規模ならそもそも主キーやインデックスを使わないですしねぇ。(後で張る)
crusted table のデータの積み上げ方(構造)とか全文検索を考えとかないとないから
まあそんなことはおいといて好みの話だったらBですなぁ

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

最新の回答から1ヶ月経過したため この意見交換はクローズされました

意見をやりとりしたい話題がある場合は質問してみましょう!

質問する

関連した質問