ObsidianのWikiリンクをブロックIDベースのリレーショナルデータベースへ移行する工程
April 30, 2026
0
Computing/SoftwareComments (0)
Log in to leave a comment
No posts yet
Log in to leave a comment
No posts yet
Obsidianを使っていると、ファイル名を一つ変更しただけで、関連する数百個のリンクが切れてしまう場面に遭遇します。文書が数千個に増えれば、インデックスの遅延によりタイピングすらままならなくなります。ファイルベースのシステムには、結局のところ明確な限界があるのです。思源(SiYuan)はこの問題をシンプルに解決します。すべての要素を20桁の固有識別子が付与されたブロックとして定義し、SQLiteカーネルに投入します。ファイル名ではなくブロックIDを追跡するため、物理的な場所をどれだけ移動させてもリンクが壊れることはありません。実際に数万個のMarkdownファイルを保有する環境でブロック体系に移行した際、参照エラーの発生率は0.1%未満にまで低下します。
非定型データをリレーショナルデータベースに移すには、Pythonの正規表現スク립トが必要です。
reモジュールで[[ファイル名#ヘッダー]]パターンを検出する正規表現を実行します。((BlockID "アンカーテキスト"))にすべて置換します。この工程を経ることで、手動でリンクを復旧するために費やしていた時間を丸ごと節約できます。ファイルシステムの柔軟性よりも、データベースの厳格な外部キー(Foreign Key)関係が必要な時期なのです。
ナレッジベース全体がSQLiteで管理されているということは、シニアエンジニアにとっては強力な武器になります。Obsidianのように単純なテキストをスキャンするのではなく、標準のSQL構文で望むデータだけを動的に抽出できます。blocksテーブルは、ID、Markdown全文、タイプ、サブタイプなどの詳細なカラムスキーマをすでに備えています。数万件のノートを検索しても、応答速度はミリ秒単位です。Obsidianの単純な検索よりも、ワークフローを中断させる遅延時間が80%以上削減されます。
分散したコードスニペットをリアルタイムで管理したい場合は、埋め込みブロックとSQLを組み合わせる必要があります。
SELECT * FROM blocks WHERE type = 'c' AND subtype = 'python'クエリを入力します。AND content LIKE '%API%'条件を付け、ORDER BY created DESCで最新順にソートをかけます。別途プラグインを大量にインストールする必要もありません。標準機能だけで、数千個のノートに埋もれているPythonコードをテーマ別に自動集計するダッシュボードが完成します。
データの主権は他人のサーバーではなく、自分のコンテナから生まれます。SiYuanは公式にDockerデプロイをサポートしています。TailscaleメッシュVPNを組み合わせれば、ポートを外部に開放することなく、ゼロトラスト環境で安全にノートを同期できます。パスディレクトリトラバーサルの脆弱性やWebSocket DoS攻撃を心配することなく、自分のデータを守る方法です。
個人サーバーやNASにセキュリティを強化したインスタンスを構築する手順は以下の通りです。
-u 1000:1000オプションとボリュームマッピングを入れ、docker runコマンドを実行します。http://siyuan-node:6806に接続します。このようにアーキテクチャを組んでおけば、有料サブスクリプションサービスに毎月お金を献上する必要がなくなります。年間1万円以上の購読料を節約しながら、セキュリティはさらに強固になります。
データが数万個を超えると、SQLiteエンジン内部にも空きスペースであるデッドタプル(Dead Tuples)が蓄積されます。検索パフォーマンスが以前のようでなくなったなら、エンジンを掃除する時です。SiYuanのGoベースのカーネルはマルチコアを効率的に活用するため、初期インデックス段階でDockerコンテナに-cpusリソースを十分に割り当てるのが良いでしょう。クエリ実行計画が狂わないよう、定期的にメンテナンスコマンドを実行する必要があります。
検索応答時間を1秒未満に維持するには、以下の作業を行う必要があります。
VACUUMコマンドで削除されたデータが占めていた物理的空間を回収します。ANALYZEコマンドでデータ分布統計を更新し、SQLエンジンが最速の検索パスを見つけられるようにします。assetsフォルダにそのまま放置せず、画像のリサイズを行ったり、外部リンクに回したりしてインデックスサイズを削減します。この作業を周期的に行えば、全ストレージ容量の60%を削減できます。データが指数関数的に増えても、最初にインストールした時のあの速度を維持する秘訣です。