プロが教えるわが家の防犯対策術!

質問カテゴリが違うかもしれませんが、
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

このような場合、どのように連番を採番しますか?
アプリケーション側で同期処理を行うべきなのでしょうか。

なにか経験等あればご教示お願いいたします。

A 回答 (2件)

んー。


トランザクション・ロックかければ、Identityでも、Max+1でも
どっちもいけるような気がします。
完全同時実行って、基本的にDB1個の仕組みじゃ無理ですし。
あくまで、Queueに入ってWaitしているだけですので。

なお、Max+1をする場合は、超厳密に行うなら採番Tに悲観的ロック
かけて参照して更新するのが超カタイやり方ですが。
親Questionキーを持つ子Answerは、投稿時タイムスタンプレベルで
ソートできればいいような気もしますので、連番Seqをそもそも
DBレベルで振らなくてもいいような気もします。
件数が少ないなら画面側で振るのもいいかと。
(OracleはRowNumありましたっけ)
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
参考にさせていただきます。

Sequence でIDを振れば連番列は必要なくなるのですが、
もし絶対この持ち方をしてくれと言われた場合はどうなるのか気になりました。
かつ、ナチュラルキーとしては、このように親キーと連番を持つのが分かりやすいのかなと思った次第です。

今回は、Sequence を使って対応しようと思います。

お礼日時:2009/11/06 09:42

T質問テーブルのデータ値が特定できるのであれば、データ毎にシーケンスを用意すれば良いと思います。


シーケンス例:
質問ID/シーケンス
1/シーケンス1
2/シーケンス2

T質問テーブルのデータ値が特定できないのであれば、上記の「シーケンス例」で記述したものを、別のテーブルで管理すれば良いのではないでしょうか?
上記の状態で、T質問テーブルの質問IDが
・1だった場合、管理テーブルを参照し、シーケンス1を使用
・3だった場合、管理テーブルにデータがないため、シーケンス3を新たに作成し、シーケンス3を使用
※質問IDのデータの種類が少なければ良いと思います。
    • good
    • 0
この回答へのお礼

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

質問は随時投稿されるため、
質問ごとにシーケンスを持つのは難しいかなと思っています。

今回は Sequence 1つでIDを発行しようと思います。
ありがとうございました。

お礼日時:2009/11/06 09:44

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!