y4shiro / uma-card-deck-tools

uma-card-deck-tools.vercel.app
0 stars 0 forks source link

スキルの rarity と icon_id を Supabse の skills テーブルに追加 #33

Closed y4shiro closed 2 years ago

y4shiro commented 2 years ago

22 で実装予定の機能があったが、現在の skills テーブルにカラムが足りていないため実装出来ない事が発覚した

そのため、足りないカラムを追加して Insert SQL の生成コードも修正する

y4shiro commented 2 years ago

大まかな機能設計

Supabase の skills テーブルに rarity と icon_id のカラムを追加する

rarity カラム

master.mdb の skill_data テーブルに rarity カラムが存在する 値は number で 1 / 2 / 3 / 4 / 5 skills_rarity テーブルを追加してもいいが、カードのレアリティと違って直接 skills に埋め込んでも問題無さそう

1 は 下位スキルもしくは固有スキルの継承版、色は白 2 は 上位スキル、色は金 3 は星 1 / 2 キャラの固有下位スキル、色は白 4 は星 1 / 2 キャラの固有上位スキル、色は虹 5 は星 3 キャラの固有スキル、色は虹

icon_id カラム

master.mdb の skill_data テーブルに icon_id カラムが存在する これは単純に icon_id のアイコン名そのもの

y4shiro commented 2 years ago

master.mdb からデータ抽出

select sd.id as id,
       td."text" as name,
       sd.rarity as rarity,
       pt.need_skill_point as skill_pt,
       sd.icon_id as img_path
  from skill_data as sd
  left join text_data as td
    on sd.id = td."index"
  left join single_mode_skill_need_point as pt
    on sd.id = pt.id
 where td.category = 47;

id / name / rarity / skill_pt / img_path を抽出できる様になった

上の SQL の抽出結果を元に、insert_skills.sql を手動で作成 db/seeds/insert_skills.sql を更新した

master.mdb から自動生成するコードを書きたいが、今回優先度低いのでパス 開発一段落したら取り組むかも

y4shiro commented 2 years ago

Supabase の skills テーブルにカラム追加

skills テーブルは幾つかの中間テーブルや View が参照しているので、このままでは rarity カラムの追加が行えない Skills に依存してる View の削除と中間テーブルの外部キー設定を一旦外した後に rarity カラムを追加する

skills に依存している View と外部キー設定を削除

card_training_skills と card_event_skills が外部キーで依存している?ので、外部キー制約を一旦削除 また、依存している View も削除した

skills テーブルに rarity カラム追加

rarity カラムを追加した

skills テーブルに外部依存していた項目を再設定

先程外した card_training_skills と card_event_skills の外部キーを再設定した

y4shiro commented 2 years ago

Supabase の Skills テーブルにデータ流し込み

先程生成した db/seeds/insert_skills.sql を Supabase に流し込んだ

y4shiro commented 2 years ago

View を再定義

先程削除した View を再定義 この際、view_training_skills と view_event_skills に関しては、rarity のカラムを追加した

-- create view view_card_training_skills as
select cards.id as card_id,
       case
         when count(card_training_skills.card_id) = 0 then '[]'
         else json_agg(
                json_build_object(
                  'id', skills.id,
                  'name', skills.name,
                  'rarity', skills.rarity, -- 追加
                  'skill_pt', skills.skill_pt,
                  'img_path', skills.img_path
                )
             )
         end as values
  from cards
  left join card_training_skills
    on cards.id = card_training_skills.card_id
  left join skills
    on card_training_skills.skill_id = skills.id
 group by cards.id
 order by cards.id;

view_event_skills もほぼ同じ構造なので省略

y4shiro commented 2 years ago

CardType の型定義に rarity 追加

skills テーブルに rarity を追加して img_path を必須にしたので型定義を変更した

src/types/cards.ts

export type EventSkill = {
  id: number;
  name: string;
  rarity: 1 | 2 | 3 | 4 | 5; // 追加
  skill_pt: number | null;
  img_path: string; // null を削除
};

export type TrainingSkill = {
  id: number;
  name: string;
  rarity: 1 | 2 | 3 | 4 | 5; // 追加
  skill_pt: number | null;
  img_path: string; // null を削除
};
y4shiro commented 2 years ago

気がついた、気になった点

DB のテーブル設計が甘かった結果今回の作業が必要になったので、設計は最初でしっかり練っておくのが重要だと再認識した テーブルドロップしたくない場合は、追加カラムは null 許容しておいてデータ追加後に null を制限するのが良さそう

スキルリストのレアリティ毎の背景色設定と、スキルアイコンの表示はそれぞれ新規 Issue 立てて実装したい

y4shiro commented 2 years ago

merge したので close