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

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

新規登録して質問してみよう
ただいま回答率
85.48%
SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

MariaDB

MariaDBは、MySQL派生のオープンソースなリレーショナルデータベースシステムです。 また、MySQLとほぼ同じデータベースエンジンに対応しています。

Q&A

解決済

3回答

2176閲覧

RDBで1レコードに可変個数のデータが対応するときのUPDATE

lazex

総合スコア604

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

MariaDB

MariaDBは、MySQL派生のオープンソースなリレーショナルデータベースシステムです。 また、MySQLとほぼ同じデータベースエンジンに対応しています。

0グッド

0クリップ

投稿2016/07/29 16:10

1つのレコードに可変個数のデータを持たせるデータの構造なときです。

こんな感じの構造です。

json

1{ 2 title: "a", 3 data: [ 4 {name: "x"}, 5 {name: "y"}, 6 {name: "z"}, 7 ] 8}

これを

table_main - id (autoincrement) - title table_sub - id (autoincrement) - mid (fkey to table_main.id) - name

のようなテーブル構造で保存してるとします。

データを

json

1{ 2 title: "b", 3 data: [ 4 {name: "y"}, 5 {name: "z2"}, 6 ] 7}

のように変更したときに、 table_sub はどのように更新処理すべきでしょうか。

この場合だと、xがなくなって、yはそのまま、zがz2変更となっています。
こういう情報を更新する時に、SELECT で取ってきたデータと更新するデータとを比較して削除・追加・変更の3パターンに分けてそれぞれ処理するというのは大変です。
なので、普段は table_sub に対して mid で検索して更新対象の mid のデータを全件削除して、新しい登録データを新規に INSERT してます。

data の配列が数千とかあるわけでないなら速度面でも対して気になるものではないのですが、data のような可変個のデータを持つものが4つ、5つとあるような時で、title だけしか変更してないのに全部削除+新規追加ってムダだなーと思いました。

それに、もし table_sub の id に別テーブルから外部キーが設定されていたら、全件削除してとはいかなくなりますし、なにか良い方法はあるのでしょうか。

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

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

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

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

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

guest

回答3

0

結論は出てるようですが…
将来的に? table_sub に更新日付を入れよう
なんて話になったら個別にちまちま更新かけるしか
なくなるので、そのへんちょっと心配かなあ。

投稿2016/07/30 15:42

takasima20

総合スコア7458

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

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

lazex

2016/07/31 08:14

更新日時でも変更してない行を消してしまったらだめですね。 必要になれば編集する側で変更情報を保持させる作りにすることにします。
guest

0

上記のテーブル構成にて、更新を効率よく行う方法として、josnで受け取る情報に
title: "a"は"b"に変わりました。name"x"は削除されました。name"z"は、"z2"に更新されました。
と言う情報をjsonで受け取とる方法が有ります。(jsonにはこだわりませんが)
上記受信jsonの場合は、title"a"のsubメンバー構成を全件削除して、titel"b"に更新してsubをインサートするしか私も考えが浮かびませんでした。

例えば、クライアントのプログラムで表示して更新、削除を行っているとする場合、クライアントでは、この差分情報の作成が可能と思います。

投稿2016/07/29 18:06

A.Ichi

総合スコア4070

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

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

lazex

2016/07/30 15:33

idを持たせるなどしてjsonを見るだけで ・削除するデータ ・更新するデータ ・新規追加するデータ ・何もしないデータ に分けてそれぞれの処理をするということですね やはりそうなりますか。 ありがとうございます。
guest

0

ベストアンサー

今の構造だと親データだけが変更されたのか紐付いている子データも変更されているのかの判断が難しい気がしますね…

例えばJSON側で子データが置き換わったことを示す情報(フラグ)などを保持できるなら、
その値をベースに親データのみを更新するなどの制御は可能かと思いますが…。

子データの方は追加・更新・削除については、
個人的には特にパフォーマンス上の問題がなく要件も満たしているなら現行のままDELETE、INSERTで良いと思います。

投稿2016/07/29 17:39

Panzer_vor

総合スコア1636

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

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

lazex

2016/07/30 15:34

もうしばらく待ってみて、DELETE+INSERTは良くないって回答がなければそうしようかなと思います。 (table_subに外部キーが必要にならないことを祈って・・・) ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問