y4shiro / uma-card-deck-tools

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

DB に "サポカに所属するキャラ ID のテーブル" を定義し、JSON 出力に追加 #27

Closed y4shiro closed 2 years ago

y4shiro commented 2 years ago

23 にて設計漏れが発覚したので、DB に必要なテーブルを追加して対処する

具体的な話をすると、サポカのデッキ編成では同じキャラクターの別カードは重複して編成できない制限があるが、 そのデータを DB 側で持っていないため制限をかけることが出来ない状態 これを解消したい

キャラ単体のサポカならテーブルを追加しなくても実装可能だが、グループカードでは一枚のサポカに複数キャラが所属してるため "サポカに所属するキャラ ID のテーブル" が必須となる

y4shiro commented 2 years ago

card_group テーブルを定義

master.mdb 内の support_card_group のテーブルにはグループカードに所属する chara_id が登録されている Supbase 側でもこのテーブルの値を持たせたい

下図内のの赤枠で囲った card_group を定義した card_group

y4shiro commented 2 years ago

card_group テーブルにレコードを追加する SQL を定義

現状では Group カードが 2 枚しか無いので、手動でコピペするに留めた 今後 Group カードが急増する場合は Insert 用の SQL を自動生成するコードを書く予定

insert into card_group (card_id, charactor_id)
values
(30081,1013),
(30081,1030),
(30081,1035),
(30081,1016),
(30081,1002),
(30081,1001),
(30067,1017),
(30067,1003),
(30067,1073);
y4shiro commented 2 years ago

サポカに所属するキャラ ID 一覧の View を定義する

サポカの仕様を簡単に説明すると、サポカ 1 枚につきキャラクターが 1 人以上所属している Group カードのみ複数のキャラクターが所属しているので、Group カードとそれ以外で処理を分ける

view_card_belong_charactor_ids

-- create view view_card_belong_charactor_ids as
select cards.id as card_id,
       charactors.id as charactor_id,
       charactors.name as charactor_name,
       case
         when cards.id = card_group.card_id then
           json_agg(
             card_group.charactor_id
           )
         else json_agg(charactors.id)
        end as belong_charactor_ids
  from cards
  left join charactors
    on cards.charactor_name = charactors.name
  left join card_group
    on cards.id = card_group.card_id
  group by cards.id, charactors.id, charactors.name, card_group.card_id
  order by cards.id;

cards テーブルの設計が甘く、本来であれば charactor_id を持つべきだった 今回は cards.caractor_name = charactors.name のようにキャラ名から逆引きして charactor_id を取得しているが、 この辺りは好ましくないので後ほど cards テーブルに直接 charactor_id を持たせるようにしたい

y4shiro commented 2 years ago

view_cards_json に先ほど作成した view を join する

view_cards_json

-- create view view_cards_json as
select cards.id as card_id,
       cards.name as card_name,
       belong_charactor_ids.charactor_id,
       belong_charactor_ids.belong_charactor_ids,
       cards.rarity as card_rarity,
       cards.type as card_type,
       cards.img_path as card_img_path,
       cards.icon_path as card_icon_path,
       effects.values as effects,
       event_skills.values as event_skills,
       training_skills.values as training_skills,
       status_gain.values as status_gain
  from cards
  join view_card_belong_charactor_ids as belong_charactor_ids
    on cards.id = belong_charactor_ids.card_id
  join view_card_effects as effects
    on cards.id = effects.card_id
  join view_card_event_skills as event_skills
    on cards.id = event_skills.card_id
  join view_card_training_skills as training_skills
    on cards.id = training_skills.card_id
  join view_card_training_status_gain as status_gain
    on cards.id = status_gain.card_id;

単純に View を Join してカラムに追加するだけ

y4shiro commented 2 years ago

cards.json の型定義を更新

TS の型定義を修正した src/types/cards.ts

export type CardType = {
  card_id: number;
  card_name: string;
  charactor_name: string;
  charactor_id: number; // 追加
  belong_charactor_ids: number[]; // 追加
  card_rarity: 'R' | 'SR' | 'SSR';
  card_type: 'Speed' | 'Stamina' | 'Power' | 'Guts' | 'Wisdom' | 'Friends' | 'Group';
  card_img_path: string | null;
  card_icon_path: string | null;
  effects: Effects[];
  event_skills?: EventSkill[];
  training_skills?: TrainingSkill[];
  status_gains?: StatusGain[];
};
y4shiro commented 2 years ago

「!サポート重複」の機能を実装する Issue 立てる

y4shiro commented 2 years ago

Merge する

した