新しいデータの挿入を伴う多くのローカルデバイス上でオフラインのiPad/Androidアプリバージョンを持つ新しいWebアプリを構築しています。そのため、マスターデータベースとの必要な双方向同期を可能にするためにUUIDを使用する必要があります。このために、UUIDをBINARY(16)
主キーとして保存します。
調査後に私が学んだ問題は、非シーケンシャルな主キーの挿入に必要な時間が時間の経過とともに増加し、これらの挿入が断片化につながることです(ここで回答)。の利点AUTO_INCREMENT
は、通常、新しい行がテーブルの最後に追加されるだけなので、UUIDの速度の問題が発生しないことです。
私の質問は、AUTO_INCREMENT
列を主キーとして使用し、UUID列をnull以外の一意のインデックスとして使用する方がよいかどうかです。おそらく、これには、分散データベースの同期に必要なUUIDを保持しながら、順次挿入の速度の利点があります。
これで私が見ることができる1つの問題は、UUIDを他のテーブル(つまり、サイトに添付されている検査に添付されている問題のリスト)への参照として(外部キー制約を使用して)使用する必要があることです。挿入に関与しているため、すべてUUIDが必要です)。意味的には、主キーが参照である方が理にかなっていますが、分散システムであるAUTO_INCREMENTS
ため、これらに使用することはできません。JOIN
これらの参照(およびもちろん、それらに付属するs)に、主キーではなく(null以外の)一意のインデックスを使用することには欠点がありますか?
マスター(オンライン)データベースはMySQL(InnoDB)を使用し、分散(オフライン)データベースはSQLiteを使用することにも注意してください。
編集:
UUIDを主キーとして使用する方がおそらく良いことを考えると(意味的にはそれが何であるか)、UUIDを主キーとして設定し、AUTO_INCREMENT
列をnull以外の一意のインデックスとして設定すると、順次挿入のメリットが得られますか? ?それとも、新しい行を挿入する場所を決定するときに関連するのは主キーだけですか?