07-database
データベース
このページは自動生成です。直接編集しないこと。
python tools/gen_manual_ref.pyで再生成する。内容を変えたいときは下の生成元を直す。
生成元
crates/melodear-db/src/schema.rscrates/melodear-db/src/repository.rs
ライブラリごとに 1 つの SQLite。テーブルの実体と移行の連鎖はここが真実。個々の列の意味は repository.rs の読み書き箇所を見る。
版
現在のスキーマ版は 67(PRAGMA user_version)。
起動時に migrate() が現在値を読み、足りない分の SQL を順に流す。既に最新なら追加インデックスの確認だけ行う。
テーブル(66)
acoustid_candidatesalbum_ratingsanalysis_candidatesartwork_statusasset_chain_overrideasset_tagsasset_ucs_tagsassetsaudio_embeddingschain_presetscircle_codescirclesdlsite_title_search_misseditor_window_positionsexport_historyfolder_artworkgenre_source_weightsinferred_metadatalibrarieslookup_metadatametadata_revisionsml_correctionsplay_eventsplugin_chain_slotsplugin_chainspluginsproject_assetsprojectsrepair_diagnosticssmart_playlistssong_chordssong_segmentsspectrogram_cachestem_mixer_settingsstem_separationstagstext_embeddingstrack_playlist_itemstrack_playliststranscriptsuser_cue_pointsuser_loopsvectorsvoice_actorsvoice_annotationsvoice_bookmark_itemsvoice_bookmarksvoice_dom_playlist_itemsvoice_dom_playlistsvoice_embedding_configsvoice_interactionsvoice_migration_snapshotsvoice_playback_prefsvoice_playback_resumevoice_product_actorsvoice_product_assetsvoice_product_codesvoice_product_tagsvoice_productsvoice_search_sessionsvoice_segment_embeddingsvoice_seriesvoice_subtitle_linksvoice_tagsvoice_taste_scoreswaveform_cache
移行中の作業テーブル(通常は残らない): transcripts_new, voice_dom_playlist_items_new, voice_dom_playlists_new, voice_interactions_new, voice_product_actors_new, voice_product_actors_v63, voice_product_tags_new, voice_product_tags_v63, voice_products_old, voice_search_sessions_new
assets の列
| 列 | 型 / 制約 | 追加 |
|---|---|---|
id | INTEGER PRIMARY KEY AUTOINCREMENT | v1 |
sha256 | TEXT NOT NULL UNIQUE | v1 |
path | TEXT NOT NULL | v1 |
filename | TEXT NOT NULL | v1 |
folder | TEXT NOT NULL | v1 |
file_size | INTEGER | v1 |
date_added | INTEGER NOT NULL | v1 |
date_modified | INTEGER | v1 |
container | TEXT | v1 |
codec | TEXT | v1 |
duration_sec | REAL | v1 |
sample_rate | INTEGER | v1 |
channels | INTEGER | v1 |
bits_per_sample | INTEGER | v1 |
title | TEXT | v1 |
artist | TEXT | v1 |
album | TEXT | v1 |
album_artist | TEXT | v1 |
track_number | TEXT | v1 |
disc_number | TEXT | v1 |
date | TEXT | v1 |
genre | TEXT | v1 |
composer | TEXT | v1 |
comment | TEXT | v1 |
bpm_tag | TEXT | v1 |
key_tag | TEXT | v1 |
key_camelot | TEXT | v1 |
is_favorite | INTEGER NOT NULL DEFAULT 0 | v1 |
is_hidden | INTEGER NOT NULL DEFAULT 0 | v1 |
needs_content_hash | INTEGER NOT NULL DEFAULT 0 | v1 |
bpm_resolved | REAL | 後続 |
key_resolved_camelot | TEXT | 後続 |
energy_resolved | INTEGER | 後続 |
beat_grid_json | TEXT | 後続 |
analysis_source | TEXT | 後続 |
analysis_confidence | REAL | 後続 |
analyzed_at | INTEGER | 後続 |
bit_rate | INTEGER | 後続 |
has_drm | INTEGER NOT NULL DEFAULT 0 | 後続 |
compilation | INTEGER NOT NULL DEFAULT 0 | 後続 |
grouping | TEXT | 後続 |
movement_title | TEXT | 後続 |
movement_number | TEXT | 後続 |
work | TEXT | 後続 |
show | TEXT | 後続 |
episode_number | TEXT | 後続 |
media_kind | TEXT | 後続 |
description | TEXT | 後続 |
sort_title | TEXT | 後続 |
sort_artist | TEXT | 後続 |
sort_album | TEXT | 後続 |
sort_album_artist | TEXT | 後続 |
sort_composer | TEXT | 後続 |
rating | INTEGER | 後続 |
is_loved | INTEGER NOT NULL DEFAULT 0 | 後続 |
is_checked | INTEGER NOT NULL DEFAULT 1 | 後続 |
issue_flag | INTEGER NOT NULL DEFAULT 0 | 後続 |
custom_1 | TEXT | 後続 |
custom_2 | TEXT | 後続 |
custom_3 | TEXT | 後続 |
custom_4 | TEXT | 後続 |
custom_5 | TEXT | 後続 |
last_played | INTEGER | 後続 |
play_count | INTEGER NOT NULL DEFAULT 0 | 後続 |
skip_count | INTEGER NOT NULL DEFAULT 0 | 後続 |
last_analyzed_at | INTEGER | 後続 |
danceability | REAL | 後続 |
mood_acoustic | INTEGER | 後続 |
mood_electronic | INTEGER | 後続 |
mood_aggressive | INTEGER | 後続 |
mood_relaxed | INTEGER | 後続 |
mood_happy | INTEGER | 後続 |
mood_sad | INTEGER | 後続 |
mood_party | INTEGER | 後続 |
timbre | TEXT | 後続 |
transition_score | REAL | 後続 |
mpm | REAL | 後続 |
tuning_cents | REAL | 後続 |
time_signature | TEXT | 後続 |
notes | TEXT | 後続 |
valence | REAL | 後続 |
arousal | REAL | 後続 |
mood_inferred_at | INTEGER | 後続 |
fingerprint_blob | BLOB | 後続 |
fingerprint_algorithm | TEXT | 後続 |
fingerprint_version | INTEGER | 後続 |
fingerprint_duration | REAL | 後続 |
fingerprint_computed_at | INTEGER | 後続 |
acoustid_id | TEXT | 後続 |
mbid_recording | TEXT | 後続 |
mbid_match_score | REAL | 後続 |
mbid_resolved_at | INTEGER | 後続 |
genre_ml_json | TEXT | 後続 |
genre_musicbrainz_json | TEXT | 後続 |
genre_lastfm_json | TEXT | 後続 |
genre_discogs_json | TEXT | 後続 |
genre_listenbrainz_json | TEXT | 後続 |
genre_external_fetched_at | INTEGER | 後続 |
genre_consensus_json | TEXT | 後続 |
genre_consensus_computed_at | INTEGER | 後続 |
genre_consensus_priority_hash | TEXT | 後続 |
genre_ml_model_id | TEXT | 後続 |
genre_ml_inferred_at | INTEGER | 後続 |
is_sample | INTEGER NOT NULL DEFAULT 0 | 後続 |
sample_category | TEXT | 後続 |
sample_is_loop | INTEGER | 後続 |
sample_top3_json | TEXT | 後続 |
sample_inferred_at | INTEGER | 後続 |
integrated_lufs | REAL | 後続 |
true_peak_db | REAL | 後続 |
analysis_engine_version | TEXT | 後続 |
vocal_presence | REAL | 後続 |
is_instrumental | INTEGER NOT NULL DEFAULT 0 | 後続 |
brightness | REAL | 後続 |
harmonicity | REAL | 後続 |
noisiness | REAL | 後続 |
rms_db | REAL | 後続 |
crest_db | REAL | 後続 |
dominant_note | TEXT | 後続 |
dominant_hz | REAL | 後続 |
bit_depth | INTEGER | 後続 |
dominance | REAL | 後続 |
mood_source | TEXT | 後続 |
needs_content_hash | INTEGER NOT NULL DEFAULT 0 | 後続 |
dominant_cents | INTEGER | 後続 |
sample_loop_distribution | TEXT | 後続 |
voice_sort_album_artist | TEXT | 後続 |
voice_sort_album | TEXT | 後続 |
voice_sort_rule_version | INTEGER NOT NULL DEFAULT 0 | 後続 |
section | TEXT | 後続 |
section_rule_version | INTEGER NOT NULL DEFAULT 0 | 後続 |
missing_since | INTEGER | 後続 |
マイグレーションの連鎖(64 段)
古い DB を開くと、user_version の値から下の段を順に適用して現在版まで持ち上げる。段番号が飛んでいるのは、複数版をまとめて 1 段で移行しているところ。
| 段 | SQL 定数 | 備考 |
|---|---|---|
| 初期化 (v1) | INIT_SQL_V1 | Phase 2c base schema (v1). |
| v1 → v2 | MIGRATE_V1_TO_V2_SQL | v1 → v2 migration (ADR-0006). |
| v2 → v3 | MIGRATE_V2_TO_V3_SQL | v2 → v3 migration (ADR-0010 metadata revision history). |
| v3 → v4 | MIGRATE_V3_TO_V4_SQL | v3 → v4: feature vectors table (Phase 4d). |
| v4 → v5 | MIGRATE_V4_TO_V5_SQL | v4 → v5: smart playlists (Phase 4f). |
| v5 → v6 | MIGRATE_V5_TO_V6_SQL | v5 → v6: Russell valence / arousal (Phase 5b / 5e). |
| v6 → v9 | MIGRATE_V6_TO_V9_SQL | v6 → v9: user cue points + A-B loops (Phase 6d). Intermediate v7/v8 reserved. |
| v9 → v10 | MIGRATE_V9_TO_V10_SQL | v9 → v10: plugin registry (ADR-0014 D9, Phase 7a). |
| v10 → v11 | MIGRATE_V10_TO_V11_SQL | v10 → v11: master plugin chains + slots (Phase 7d, ADR-0014 D9). |
| v11 → v12 | MIGRATE_V11_TO_V12_SQL | v11 → v12: editor window positions + chain presets (Phase 7e, ADR-0014 D4/D10). |
| v12 → v13 | MIGRATE_V12_TO_V13_SQL | v12 → v13: stem separation cache metadata (Phase 8b). |
| v13 → v14 | MIGRATE_V13_TO_V14_SQL | v13 → v14: AcoustID fingerprint + MBID resolution (Phase 6g.1). |
| v14 → v15 | MIGRATE_V14_TO_V15_SQL | v14 → v15: repair diagnostics + per-track chain override (Phase 8e). |
| v15 → v16 | MIGRATE_V15_TO_V16_SQL | v15 → v16: export history (Phase 8d). |
| v16 → v17 | MIGRATE_V16_TO_V17_SQL | v16 → v17: external genre sources + consensus (Phase 6g.5). |
| v17 → v18 | MIGRATE_V17_TO_V18_SQL | v17 → v18: ML genre metadata + audio embeddings (Phase 5c.5). |
| v18 → v19 | MIGRATE_V18_TO_V19_SQL | v18 → v19: DTM sample classification (Phase 5d). |
| v19 → v20 | MIGRATE_V19_TO_V20_SQL | v19 → v20: UCS tags + project management (Phase 6f). |
| v20 → v21 | MIGRATE_V20_TO_V21_SQL | v20 → v21: path inference cache + folder artwork blobs (Phase 6h.1). |
| v21 → v22 | MIGRATE_V21_TO_V22_SQL | v21 → v22: DLsite / DMM online lookup cache (Phase 6h.2). |
| v22 → v23 | MIGRATE_V22_TO_V23_SQL | v22 → v23: song structure segments (Phase 7g.5). |
| v23 → v24 | MIGRATE_V23_TO_V24_SQL | v23 → v24: loudness metrics for replay normalization (ana-02). |
| v24 → v25 | MIGRATE_V24_TO_V25_SQL | v24 → v25: analyzer engine version for outdated re-analyze. |
| v25 → v26 | MIGRATE_V25_TO_V26_SQL | v25 → v26: advanced analysis (chords / vocal presence). |
| v26 → v27 | MIGRATE_V26_TO_V27_SQL | v26 -> v27: multi-aspect similarity vectors. |
| v27 → v28 | MIGRATE_V27_TO_V28_SQL | v27 -> v28: audio embedding version column (ai-01). |
| v28 → v29 | MIGRATE_V28_TO_V29_SQL | v28 -> v29: Whisper transcripts + FTS5 + Japanese text embeddings (ai-05). |
| v29 → v30 | MIGRATE_V29_TO_V30_SQL | v29 -> v30: content_kind on libraries + DoujinVoice schema (voice-01 / content-01 partial). |
| v30 → v31 | MIGRATE_V30_TO_V31_SQL | v30 -> v31: voice-log-01 compatible tables for DOM-Alpha import (voice-03). |
| v31 → v32 | MIGRATE_V31_TO_V32_SQL | v31 -> v32: voice-05 playback resume + per-library prefs. |
| v32 → v33 | MIGRATE_V32_TO_V33_SQL | v32 -> v33: voice-06 subtitle file links per asset. |
| v33 → v34 | MIGRATE_V33_TO_V34_SQL | v33 -> v34: voice-log-01 nullable dom_id for GUI-generated rows (partial unique indexes). |
| v34 → v35 | MIGRATE_V34_TO_V35_SQL | v34 -> v35: voice-mig-01 snapshots for libraries that already applied v33 subtitle-only. |
| v35 → v36 | MIGRATE_V35_TO_V36_SQL | v35 → v36: waveform cache index (.wfm files live under <library>/.melodear/waveforms/). |
| v36 → v37 | MIGRATE_V36_TO_V37_SQL | v36 → v37: Sononym-like scalar facets (filter-panel-01). |
| v37 → v38 | MIGRATE_V37_TO_V38_SQL | v37 -> v38: emotion-01 mood source and dominance storage. |
| v38 → v39 | MIGRATE_V38_TO_V39_SQL | v38 -> v39: art-01 アートワーク有無の判定結果(負キャッシュ含む)。 サムネ実体は .melodear/artwork-cache.db(別ファイル・派生データ)に置き、 「ある/ない」の知識のみ melodear.db に残す(キャッシュ削除後も再構築対象が分かる)。 |
| v39 → v40 | MIGRATE_V39_TO_V40_SQL | v39 -> v40: spectrogram cache index (.spec files live under <library>/.melodear/spectrograms/). |
| v40 → v41 | MIGRATE_V40_TO_V41_SQL | v40 -> v41: fast scan identity. New imports may use a path-derived placeholder sha and ask a background worker to backfill the real content hash later. |
| v41 → v42 | MIGRATE_V41_TO_V42_SQL | v41 -> v42: ana-10a-C. dominant note の f0 セント偏差(-50..50、NULL 可)を保存。 |
| v42 → v43 | MIGRATE_V42_TO_V43_SQL | v42 -> v43: ana-10b-C. ループのスライス分類カテゴリ分布を JSON で保存 ([{"category":"kick","score":0.4},…]、NULL 可)。 |
| v43 → v44 | MIGRATE_V43_TO_V44_SQL | v43 -> v44: colab-1. ユーザーの分類修正レコード(ローカルプロトタイプ用)。 |
| v44 → v45 | MIGRATE_V44_TO_V45_SQL | v44 -> v45: album-level user rating, independent from per-track rating. |
| v45 → v46 | MIGRATE_V45_TO_V46_SQL | v45 -> v46: lookup_metadata (source, work_code) must allow multiple assets (same work across tracks). Drop UNIQUE; keep non-unique lookup index. (voicelib-7) |
| v46 → v47 | MIGRATE_V46_TO_V47_SQL | v46 -> v47: multi-site voice product codes + lookup image URL cache (voicelib-9). |
| v47 → v48 | MIGRATE_V47_TO_V48_SQL | v47 -> v48: voice_dom_playlists.dom_id nullable for GUI-created playlists (partial unique index). Table name kept for DOM-Alpha; UI label is 「プレイリスト」. Pattern mirrors MIGRATE_V33_TO_V34_SQL (voicelib-10). |
| v48 → v49 | MIGRATE_V48_TO_V49_SQL | v48 -> v49: lookup cache parser generation + voice_products.age_rating (voicelib-11). migrate() may apply this as a whole or column-by-column when CREATE already added one side. |
| v49 → v50 | MIGRATE_V49_TO_V50_SQL | v49 -> v50: DLsite title-search miss negative cache (voicelib-15). |
| v50 → v51 | MIGRATE_V50_TO_V51_SQL | v50 -> v51: title-search miss reason + sample asset (voicelib-18 failure inbox). |
| v51 → v52 | MIGRATE_V51_TO_V52_SQL | v51 -> v52: title-search miss search_version (voicelib-19 negative-cache generation). |
| v52 → v53 | MIGRATE_V52_TO_V53_SQL | v52 -> v53: circles.dlsite_maker_id (voicelib-21 circle-first resolve). Later moved to circle_codes and dropped in v65→v66 (fanzacircle-2). |
| v53 → v54 | MIGRATE_V53_TO_V54_SQL | v53 -> v54: path-derived section cache for SQL sort (sort-1). SSOT remains the file path; these columns are a derived cache (not user-editable). |
| v54 → v55 | MIGRATE_V54_TO_V55_SQL | v54 -> v55: mirror stamp on libraries (ADR-0033 / dbloc-1). |
| v55 → v56 | MIGRATE_V55_TO_V56_SQL | v55 -> v56: folder_artwork content hash (fix-22 B-1). Blob export + VACUUM are not done here (too heavy) — maintenance path only. |
| v56 → v57 | MIGRATE_V56_TO_V57_SQL | v56 -> v57: tagfix-1 CP932-as-Latin-1 mojibake repair (data only; no DDL). Applied in Rust via [crate::cp932_tag_repair::repair_cp932_tag_mojibake]. |
| v57 → v58 | MIGRATE_V57_TO_V58_SQL | v57 -> v58: air-5 manual track playlists (ordered; duplicates allowed). |
| v58 → v59 | MIGRATE_V58_TO_V59_SQL | v58 -> v59: agefilter-1 age rating provenance + fetch timestamp. |
| v59 → v60 | MIGRATE_V59_TO_V60_SQL | v59 -> v60: subschema-1 — transcripts PK (asset_id, source) + voice_annotations (ADR-0035 D1/D2). Recreates transcripts (SQLite cannot ALTER PRIMARY KEY). Backfills source from model_id: rows whose model_id starts with subtitle: (DIALOGUE_MODEL_SUBTITLE_PREFIX) become sidecar; all others become whisper. Rebuilds transcripts_fts with source UNINDEXED and regenerates rows from the new table. |
| v60 → v61 | MIGRATE_V60_TO_V61_SQL | v60 -> v61: rebuild transcripts_fts with trigram tokenizer (CJK substring search). unicode61 treats unbroken Japanese as one token, so partial matches fail. Transcript rows themselves are unchanged — FTS only. |
| v62 → v63 | MIGRATE_V62_TO_V63_SQL | missing-1: ディスクに無いファイルを行削除せず missing_since で表す。 |
| v63 → v64 | MIGRATE_V63_TO_V64_SQL | workcode-3: tags / actors をサイト別に持てるようにする。 |
| v64 → v65 | MIGRATE_V64_TO_V65_SQL | segvec-1: speaker/emotion 区間埋め込みの器。既存 audio_embeddings は無変更で共存。 |
| v65 → v66 | MIGRATE_V65_TO_V66_SQL | v65 -> v66: circle_codes(circle_id, site, code) + copy DLsite maker ids, then DROP circles.dlsite_maker_id (fanzacircle-2 / workcode-1 同形。二重の正を作らない). |
| v66 → v67 | MIGRATE_V66_TO_V67_SQL | v66 -> v67: materialize Voice Album Artist / Album sort keys (voicesort-2). NULL-tolerant; version 0 = not backfilled (ORDER BY falls back to path expr). |