質問: 1つのレコードに可変個数のデータを持たせるデータの構造なときです。 こんな感じの構造です。 ``` { title: "a", data: [ {name: "x"}, {name: "y"}, {name: "z"}, ] } ``` これを ``` table_main - id (autoincrement) - title table_sub - id (autoincrement) - mid (fkey to table_main.id) - name ``` のようなテーブル構造で保存してるとします。 データを ``` { title: "b", data: [ {name: "y"}, {name: "z2"}, ] } ``` のように変更したときに、 table_sub はどのように更新処理すべきでしょうか。 この場合だと、xがなくなって、yはそのまま、zがz2変更となっています。 こういう情報を更新する時に、SELECT で取ってきたデータと更新するデータとを比較して削除・追加・変更の3パターンに分けてそれぞれ処理するというのは大変です。 なので、普段は table_sub に対して mid で検索して更新対象の mid のデータを全件削除して、新しい登録データを新規に INSERT してます。 data の配列が数千とかあるわけでないなら速度面でも対して気になるものではないのですが、data のような可変個のデータを持つものが4つ、5つとあるような時で、title だけしか変更してないのに全部削除+新規追加ってムダだなーと思いました。 それに、もし table_sub の id に別テーブルから外部キーが設定されていたら、全件削除してとはいかなくなりますし、なにか良い方法はあるのでしょうか。
回答: 上記のテーブル構成にて、更新を効率よく行う方法として、josnで受け取る情報に title: "a"は"b"に変わりました。name"x"は削除されました。name"z"は、"z2"に更新されました。 と言う情報をjsonで受け取とる方法が有ります。(jsonにはこだわりませんが) 上記受信jsonの場合は、title"a"のsubメンバー構成を全件削除して、titel"b"に更新してsubをインサートするしか私も考えが浮かびませんでした。 例えば、クライアントのプログラムで表示して更新、削除を行っているとする場合、クライアントでは、この差分情報の作成が可能と思います。