ファイル名重複問題の解決:タイムスタンプ統一による根本的改善

ファイル名重複問題の解決:タイムスタンプ統一による根本的改善

プロジェクト概要

対象システム: Markdownベースポートフォリオサイト
改修日: 2025年6月10日
問題レベル: Critical(データ損失リスク)
解決方法: ファイル名生成ロジックの根本的見直し

発見された問題

症状

多言語記事(英語+日本語)において、英語部分が同じで日本語部分が異なる記事を複数作成すると、後から作成した記事が前の記事を上書きしてしまう致命的な問題が発覚。

具体例

記事A: 「Hello World こんにちは」 → Hello_World.md
記事B: 「Hello World さようなら」 → Hello_World.md ❌ 記事Aが消失

根本原因の分析

問題のコード(改修前):

# タイトルからファイル名を生成
safe_title = secure_filename(title.strip())
if safe_title:
    filename = safe_title + '.md'  # ← 問題箇所
else:
    # 日本語のみの場合
    timestamp = datetime.now().strftime('%Y%m%d_%H%M%S')
    filename = f'article_{timestamp}.md'

secure_filename()の動作特性
- 英語文字のみ保持
- 日本語文字は完全除去
- スペースをアンダースコアに変換

これにより、英語部分が同一の多言語タイトルは必ず同じファイル名になってしまう仕様でした。

解決策の検討

Option 1: タイトル+ユニークID方式

filename = f"{safe_title}_{uuid.uuid4().hex[:8]}.md"

課題: ファイル名が複雑化、可読性低下

Option 2: タイトル+連番方式

# 重複チェックして連番付与

課題: 複雑な重複検知ロジックが必要

Option 3: タイムスタンプ完全統一 ✅

timestamp = datetime.now().strftime('%Y%m%d_%H%M%S')
filename = f'article_{timestamp}.md'

メリット: シンプル、確実、言語非依存

実装した解決策

修正内容

全ての新規記事のファイル名生成をタイムスタンプ統一方式に変更:

# 改修後のロジック
timestamp = datetime.now().strftime('%Y%m%d_%H%M%S')
filename = f'article_{timestamp}.md'

ファイル名例

  • article_20250610_143045.md (2025年6月10日 14:30:45)
  • article_20250610_143102.md (2025年6月10日 14:31:02)

重複リスク評価

  • 理論的リスク: 同一秒内の連続投稿
  • 実用的リスク: ほぼゼロ(手動投稿では不可能)
  • 予約投稿: 登録時刻ベースのため問題なし

技術的配慮事項

既存データへの影響

  • 既存記事: 完全無影響(ファイル・DB・表示すべて正常)
  • 新規記事: 新ルール適用
  • 下位互換性: 完全保持

パフォーマンス影響

  • ファイルアクセス: 変化なし
  • データベース: 変化なし
  • 処理速度: 条件分岐削除により微改善

予約投稿との整合性

予約投稿機能では以下の流れ:
1. 記事登録時: ファイル名決定(タイムスタンプ)
2. 公開時: ステータス変更のみ(ファイル名不変)

この仕様により、予約投稿でも重複回避が保証されます。

改修効果と検証

Before(問題あり)

英語+日本語記事 → secure_filename() → 重複リスク高
日本語のみ記事 → タイムスタンプ → 重複リスク低
英語のみ記事 → secure_filename() → 重複リスク高

After(問題解決)

すべての記事 → タイムスタンプ → 重複リスクほぼゼロ

検証ポイント

  • [x] 多言語記事の連続作成テスト
  • [x] 予約投稿との組み合わせテスト
  • [x] 既存記事の表示確認
  • [x] 管理画面の動作確認

学んだ教訓

国際化対応の重要性

  • 文字エンコーディング: システム設計時から多言語を考慮
  • ファイル名設計: プラットフォーム依存の関数に過度に依存しない
  • テストケース: 多言語環境での境界値テスト

シンプルさの価値

  • 複雑な条件分岐単純なタイムスタンプ
  • 言語依存ロジック言語非依存ロジック
  • 保守性向上バグ混入リスク削減

今後の改善提案

短期改善

  • ミリ秒精度タイムスタンプ(高頻度投稿対応)
  • ファイル名重複検知機能(念のため)

長期改善

  • UUID方式への移行検討
  • ファイル名とタイトルの完全分離
  • 国際化フレームワーク導入

まとめ

今回の改修により、データ損失リスクを完全に排除し、多言語環境での安全な記事管理を実現しました。シンプルな解決策により、システムの信頼性と保守性を同時に向上させることができた成功事例です。

技術的ポイント
- 問題の根本原因を正確に特定
- シンプルで確実な解決策を選択
- 既存システムへの影響を最小化
- 将来的な拡張性も考慮

この改修により、ユーザーは言語を気にすることなく安心して記事を作成できるようになりました。


関連技術: Python, Flask, SQLite, Markdown, 国際化, ファイルシステム
解決カテゴリ: データ整合性, 多言語対応, システム安定性

同様の開発をご希望ですか?

この事例と同様の開発やカスタマイズについて、
お気軽にご相談ください。

お問い合わせ