質問カテゴリが違うかもしれませんが、
DB関連のため、ここで質問させていただきました。
Javaを使用したシステムで insert 処理を行います。
T質問、T回答という2つのテーブルがあります。(Tはトランの意味)
T質問とT回答は 1 : n の関係です。
1つの質問に対して複数の回答があります。
T回答の主キーを、質問ID(T質問の主キー)と回答番号(連番)とする場合、
insert の際に回答番号を振る方法としてどのような方法がありますでしょうか。
データ例:
質問ID/回答番号
1/1
1/2
1/3
2/1
2/2
max(回答番号) + 1 という方法もあると思いますが、同時実行性に問題があるかと思います。
Sequence で採番する方法もありますが、質問1つに対する回答番号が 1 から始まらないようになってしまいます。
1/1
1/2
2/3
2/4
このような場合、どのように連番を採番しますか?
アプリケーション側で同期処理を行うべきなのでしょうか。
なにか経験等あればご教示お願いいたします。
No.1ベストアンサー
- 回答日時:
んー。
トランザクション・ロックかければ、Identityでも、Max+1でも
どっちもいけるような気がします。
完全同時実行って、基本的にDB1個の仕組みじゃ無理ですし。
あくまで、Queueに入ってWaitしているだけですので。
なお、Max+1をする場合は、超厳密に行うなら採番Tに悲観的ロック
かけて参照して更新するのが超カタイやり方ですが。
親Questionキーを持つ子Answerは、投稿時タイムスタンプレベルで
ソートできればいいような気もしますので、連番Seqをそもそも
DBレベルで振らなくてもいいような気もします。
件数が少ないなら画面側で振るのもいいかと。
(OracleはRowNumありましたっけ)
ご回答ありがとうございます。
参考にさせていただきます。
Sequence でIDを振れば連番列は必要なくなるのですが、
もし絶対この持ち方をしてくれと言われた場合はどうなるのか気になりました。
かつ、ナチュラルキーとしては、このように親キーと連番を持つのが分かりやすいのかなと思った次第です。
今回は、Sequence を使って対応しようと思います。
No.2
- 回答日時:
T質問テーブルのデータ値が特定できるのであれば、データ毎にシーケンスを用意すれば良いと思います。
シーケンス例:
質問ID/シーケンス
1/シーケンス1
2/シーケンス2
T質問テーブルのデータ値が特定できないのであれば、上記の「シーケンス例」で記述したものを、別のテーブルで管理すれば良いのではないでしょうか?
上記の状態で、T質問テーブルの質問IDが
・1だった場合、管理テーブルを参照し、シーケンス1を使用
・3だった場合、管理テーブルにデータがないため、シーケンス3を新たに作成し、シーケンス3を使用
※質問IDのデータの種類が少なければ良いと思います。
ご回答ありがとうございます。
質問は随時投稿されるため、
質問ごとにシーケンスを持つのは難しいかなと思っています。
今回は Sequence 1つでIDを発行しようと思います。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) tatsumaru77様 昨日回答して頂いたものです。 すみませんが、昨日の質問で1つ補足があります 1 2022/05/15 15:06
- その他(テレビ・ラジオ) 全国TV番組の感想について地方チャンネル番号で質問しているので教えたら「もういいです」と質問削除なぜ 7 2023/07/02 11:29
- 哲学 質問 work は sealioning とどう違うのでしょうか? 1 2022/05/05 04:31
- iPhone(アイフォーン) iPhone初期化について質問です。 親から使用時間や勝手にアプリをインストールできないように規制が 2 2022/08/21 11:52
- 警察・消防 フリー電話番号を作る方法はありますか と質問したら警察に質問内容を転送しますねと回答が来ました 興味 3 2022/11/14 01:29
- LINE 携帯電話番号を変更したいのですが... 1 2022/12/14 00:50
- LINE 電話番号をへんこうしたいのですが、、 2 2022/12/14 15:46
- メディア・マスコミ 公共放送のテレビ・ラジオのニュース番組の信憑性? 2 2023/08/20 17:40
- 格安スマホ・SIMフリースマホ SIMフリースマートフォンについて質問です SHARP・AQUOS・SHG07・KDDI製 端末→設 3 2023/07/29 19:38
- 教えて!goo 回答のレスについて。 2 2023/03/23 00:23
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
RDBのテーブル種類の違い
-
他の処理でselectさせないよう...
-
object browser で処理を中断す...
-
DELETE文でFROM句を省略した場合
-
[性能改善]AccessのDBに大量の...
-
年度毎にシーケンスの初期化?
-
Oracleの欠点
-
Oracleから見たOracleの優位性(...
-
同一レコード更新時の排他制御
-
チューニング対象のSQLの見つけ...
-
データを削除しても表領域の使...
-
Viewにインデックスは張れ...
-
CLOB型へのINSERT
-
SQL*Loaderで、データを加工し...
-
異なるスキーマからデータを抽...
-
postgreSQLのint型は桁数指定が...
-
ORA-00959: 表領域'****'は...
-
Data Pump で大量データインポ...
-
特定のスキーマのテーブルを一...
-
INDEXの無効化
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
DELETE文でFROM句を省略した場合
-
他の処理でselectさせないよう...
-
RDBのテーブル種類の違い
-
同じSELECT文同士でのデ...
-
object browser で処理を中断す...
-
[性能改善]AccessのDBに大量の...
-
accessでイベントを中止するよ...
-
統計情報の取得=コミットですか?
-
チューニング対象のSQLの見つけ...
-
PL/SQLの平行処理について
-
処理速度の見積もり時間について。
-
Truncate以外で高速にテーブル...
-
ActiveX DLLでのオラクルのトラ...
-
stored procedureの引数について
-
トリガーにてUTL_FILEパッケー...
-
Access2013で操作ログを残した...
-
Oracleの欠点
-
Oracleから見たOracleの優位性(...
-
年度毎にシーケンスの初期化?
-
処理が終わったり終わらなかっ...
おすすめ情報