53

最近 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、この複合インデックスの一部であるという事実が欠落していますか? それとも、完全なテーブル スキャンを回避するために解決する必要があるインデックス作成の問題が本当にあるのでしょうか?

4

4 に答える 4