最近 Google I/O で発表された Android Architecture Components の Android の Room Persistence Library を使用しています。うまくいっているように見えますが、次のエラーが表示されます。
警告:tagId 列は外部キーを参照していますが、インデックスの一部ではありません。これにより、親テーブルが変更されるたびにフル テーブル スキャンがトリガーされる可能性があるため、この列をカバーするインデックスを作成することを強くお勧めします。
Note
私のデータベースには、 、Tag
、およびの3 つのテーブルがありJoinNotesTags
ます。Notes to Tags は多対多の関係であるため、JoinNotesTags テーブルがマッピングを処理します。表は簡単です。
Note.id
両方ともTag.id
主キーJoinNotesTags.noteId
参考文献Note.id
JoinNotesTags.tagId
参考文献Tag.id
外部キー制約はJoinNotesTags
テーブルで定義されます。参考までに、テーブルのCREATE TABLE
ステートメントを次に示します。JoinNotesTags
"CREATE TABLE IF NOT EXISTS `JoinNotesTags` (
`id` INTEGER PRIMARY KEY AUTOINCREMENT,
`noteId` INTEGER,
`tagId` INTEGER,
FOREIGN KEY(`noteId`) REFERENCES `Note`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE ,
FOREIGN KEY(`tagId`) REFERENCES `Tag`(`id`) ON UPDATE NO ACTION ON DELETE NO ACTION
)"
そして@Entity
、そのクラスに対応する注釈は次のとおりです。
@Entity(
indices = arrayOf(Index(value = *arrayOf("noteId", "tagId"), unique = true)),
foreignKeys = arrayOf(
ForeignKey(
entity = Note::class,
parentColumns = arrayOf("id"),
childColumns = arrayOf("noteId"),
onDelete = ForeignKey.CASCADE),
ForeignKey(
entity = Tag::class,
parentColumns = arrayOf("id"),
childColumns = arrayOf("tagId"))
)
)
@Entity
注釈からわかるように、tagId
はとともに複合ユニーク インデックスに含まれていnoteId
ます。自動生成された json スキーマ ファイルでも、このインデックスが正しく定義されていることを確認しました。
"CREATE UNIQUE INDEX `index_JoinNotesTags_noteId_tagId`
ON `JoinNotesTags` (`noteId`, `tagId`)"
それで、私の質問: この警告は、(まだアルファ リリースの) ルーム ライブラリの単なるバグですか?つまり、コンパイル時の分析ではtagId
、この複合インデックスの一部であるという事実が欠落していますか? それとも、完全なテーブル スキャンを回避するために解決する必要があるインデックス作成の問題が本当にあるのでしょうか?