MySQLでのテーブル設計(おすすめの構成)
「最初のチャンクだけにメタデータを紐付ける」または「ドキュメント単位のメタデータと、個々のチャンクを分ける」ために、2つのテーブルに分ける(正規化する) のが最もスマートで、AI移行時にもバグが起きにくくなります。
ドキュメント(元PDF)テーブル: documents
メタデータ(ファイル名、章、作成部署、ルール種別など)を保存します。
CREATE TABLE documents (
id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(255) NOT NULL, -- 手順書・ルール名
category VARCHAR(100), -- 部署やカテゴリ
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
チャンク(単元)テーブル: chunks
分割された中身を保存します。最初のチャンクだけに、親ドキュメントへのリンク(document_id)を持たせるか、あるいは「最初のチャンクフラグ」を持たせます。
CREATE TABLE chunks (
id INT AUTO_INCREMENT PRIMARY KEY,
document_id INT, -- 最初のチャンクだけ値を入れ、2番目以降は NULL または 0 にする(※提案の再現)
chunk_order INT NOT NULL, -- チャンクの順番(1, 2, 3...)
content TEXT NOT NULL, -- MDから変換したテキスト内容
FOREIGN KEY (document_id) REFERENCES documents(id) ON DELETE SET NULL
);
document_id を NULL にしておくことで、検索時に「メタデータを持つ最初のチャンク」と「中身だけの後続チャンク」を明確に区別できる。
- PythonでMySQLへデータ移行
• 現在 SQLite に入っているデータを、Python(mysql-connector-python や pymysql を使用)を使って、WSL2上の MySQL にインポート(吐き出し)します。
• その際、お話ししていた「最初のチャンクだけにメタデータ(document_id)を紐付ける」ロジックでデータを登録します。 - PHPで検索画面とロジックの作成
• 全文検索(LIKE検索): SELECT * FROM chunks WHERE content LIKE ‘%キーワード%’
• メタデータ連動検索: メタデータがある最初のチャンク(document_id IS NOT NULL)をフックにして、その前後のチャンクも一緒に引っ張ってくるようなPHPのクエリを書きます。
pip install mysql-connector-python
import mysql_connector
# 1. MySQLへの接続設定(PHPのPDO等で設定しているものと同じ情報を入れます)
config = {
'user': 'your_username', # MySQLのユーザー名
'password': 'your_password', # MySQLのパスワード
'host': 'localhost', # または '127.0.0.1'
'database': 'your_database_name' # 使用するデータベース名
}
try:
# 接続の開始
conn = mysql_connector.connect(**config)
cursor = conn.cursor()
# 例:データの取得
cursor.execute("SELECT * FROM documents")
rows = cursor.fetchall()
for row in rows:
print(row)
# 例:データの挿入(SQLiteから移行する際のイメージ)
# sql = "INSERT INTO chunks (document_id, chunk_order, content) VALUES (%s, %s, %s)"
# cursor.execute(sql, (1, 1, "チャンクの内容テキスト..."))
# conn.commit() # データの書き込みを確定
except mysql_connector.Error as err:
print(f"エラーが発生しました: {err}")
finally:
# 必ずクローズする
if 'cursor' in locals():
cursor.close()
if 'conn' in locals():
conn.close()
この構成で行う「SQLite ➔ MySQL移行」のイメージ
Pythonはデータ処理が得意なので、今回のタスクには最適です。
- Pythonで SQLite に接続して、保存されているMDデータやメタデータを読み出す。
- Pythonで「最初のチャンクだけにメタデータを紐付ける」処理(プログラムでの条件分岐)を施す。
- Pythonで MySQL に接続し、加工したデータをそのまま流し込む(バルクインサート)。
これが完了すれば、あとは慣れているPHPを使ってMySQLからデータを引っ張ってきて検索画面を作る、という理想の役割分担ができます。

