# キャッシュテーブル ## データ構造例 ```sql CREATE TABLE member_skill_experience_cache ( company_id INT, skill VARCHAR(100), experience VARCHAR(100), member_count INT, last_updated TIMESTAMP, -- キャッシュの有効期限の判定に利用 PRIMARY KEY (company_id, skill, experience) ); ``` ## 更新 ### 方法A: 定期的なバッチ更新 ```sql -- キャッシュテーブルのデータを一度削除 DELETE FROM member_skill_experience_cache; -- 新しい集計データをキャッシュテーブルに挿入 INSERT INTO member_skill_experience_cache (company_id, skill, experience, member_count, last_updated) SELECT m.company_id, jt.職務スキル AS skill, jt.プロジェクト経験 AS experience, COUNT(m.id) AS member_count, NOW() AS last_updated FROM members AS m JOIN JSON_TABLE( m.custom_fields, "quot; COLUMNS ( 職務スキル VARCHAR(100) PATH "$.職務スキル", プロジェクト経験 VARCHAR(100) PATH "$.プロジェクト経験" ) ) AS jt GROUP BY m.company_id, skill, experience; ``` ### 方法B: データ更新トリガーによるリアルタイム更新 - **注意**: トリガーを多用すると、トランザクション処理が増えて書き込み性能が低下する可能性があるため、リアルタイム性が特に重要な場合にのみ使用する ```sql DELIMITER // CREATE TRIGGER update_skill_experience_cache AFTER INSERT ON members FOR EACH ROW BEGIN -- キャッシュテーブルを更新 INSERT INTO member_skill_experience_cache (company_id, skill, experience, member_count, last_updated) VALUES (NEW.company_id, JSON_UNQUOTE(NEW.custom_fields->"$.職務スキル"), JSON_UNQUOTE(NEW.custom_fields->"$.プロジェクト経験"), 1, NOW()) ON DUPLICATE KEY UPDATE member_count = member_count + 1, last_updated = NOW(); END // DELIMITER ; ```