データベースの定義について[DiscordBot]

RDBMSにはPostgreSQLを使っています。

テーブル名の後ろの()の中身は、主キーを表しています。

ポケモンのデータ

pokedex(pokedex.id) ポケモンの基本データ

図鑑番号(No.)はリザードンメガリザードンX(No.=6)のように重複することがあるため、

id=No.+連番浮動小数で表現することにする。

例:

No. id name
6 6.1 リザードン
6 6.2 メガリザードンX
6 6.3 メガリザードンY
create table if not exists pokedex(
    id real primary key, --ポケモンID(id=no.form=図鑑番号.フォルム)
    no int not null, --図鑑番号
    name varchar(32) not null unique, --ポケモン名
    eng varchar(32) not null, --ポケモンの英語名
    type1 varchar(8) not null, --タイプ1(=type.eng)
    type2 varchar(8) default 'なし', --タイプ2
    abl1 varchar(32) not null, --通常特性1(=ability.abl)
    abl2 varchar(32) default 'なし', --通常特性2
    abl3 varchar(32) default 'なし', --隠れ特性
    H int not null,
    A int not null,
    B int not null,
    C int not null,
    D int not null,
    S int not null,
    sum int not null, --合計種族値
    icon text, --アイコンのURL
    height real not null, --高さ
    weight real not null, --重さ
    lowkick_power int not null, --けたぐりの威力
        stage int not null, --進化段階 1:未進化 2:中間進化 3:最終進化
    legend boolean not null, --1:伝説・幻 0:それ以外
        insv boolean not null --1:SVに存在する 0:しない
);

poke2chem ポケモンごとの弱点・耐性

※このテーブルはidごとのパーティションテーブル

パーティションテーブル名は、id=4.1のヒトカゲなら、chem4_1

--各ポケモンが攻撃されるときの耐性値の一覧
create table if not exists poke2chem(
    id real, --攻撃されるポケモンのID(=pokedex.id)
    attr varchar(8) not null, --攻撃技のタイプ
    chem real not null --攻撃されるポケモンのタイプ補正値(特性非考慮)
)partition by list(id);

lang 各言語のポケモンに関する単語の一覧

create table if not exists lang(
    class int not null, --0:ポケモン,1:技,2:特性,3:持ち物,4:タイプ,5:性格
    jpn varchar(32) not null, --日本語
    eng varchar(32) not null, --英語
    ger varchar(32) not null, --ドイツ語
    fra varchar(32) not null, --フランス語
    kor varchar(32) not null, --歓呼国語
    cs varchar(32) not null,--簡体字
    ct varchar(32) not null--繁体字
)partition by list(class);

move(move.id) 技の一覧

create table if not exists move(
    id int primary key, --技ID
    move varchar(32) unique, --技名
    attr varchar(8) not null, --技タイプ
    class varchar(2) not null, --技の分類(物理,特殊,変化,不定)
    power int not null, --威力
    accuracy int not null, --命中
    PP int not null, --PP
    direct boolean not null, --接触技かどうか
    protect boolean not null, --守るを貫通するかどうか
    target varchar(8) not null, --技の対象
    text text not null --技の説明
);

poke2move ポケモンごとの覚える技

※poke2moveのidはsvに存在しているポケモンのidのみを参照している

※このテーブルはidごとのパーティションテーブル

パーティションテーブル名は、id=4.1のヒトカゲなら、move4_1

create table if not exists poke2move(
id real, --ポケモンID(=pokedex.id)
moveid int not null --技ID(=move.id)
)partition by list(id);

type(type.eng) タイプの一覧

create table if not exists type(
    eng varchar(8) primary key,--タイプの英語名
    name varchar(8) not null, --タイプの日本語名
    name2 varchar(1) not null --タイプの単漢字名
);

ability(ability.abl)

※ability.idは全然使っていない…

create table if not exists ability(
    id int primary key, --特性ID
    abl varchar(16) not null, --特性名
    text text not null --説明
);

各種補正

cor_nature(cor_nature.nature) 性格補正表

create table if not exists cor_nature(
    nature varchar(8) primary key, --性格名
    a real not null, --A補正値
    b real not null, --以下略
    c real not null,
    d real not null,
    s real not null
);

cor_type_atk(attr=move.attr) タイプ相性表(攻)

--攻撃するときのタイプ補正値の一覧
create table if not exists cor_type_atk(
    attr varchar(8) not null, --攻撃技のタイプ
    eng varchar(8) not null,--タイプの英語名
    cor real not null --攻撃するときの補正値
);

cor_type_def(type=type.eng) タイプ相性表(防)

--攻撃されるときのタイプ補正値の一覧
create table if not exists cor_type_def(
    eng varchar(8) not null, --攻撃されるポケモンのタイプ
    attr varchar(8) not null,--技タイプの英語名
    cor real not null --攻撃されるときの補正値

cor_abl_atk(name=ability.abl) 特性補正表(攻)

--攻撃するときにタイプ補正がかかる特性の一覧
create table if not exists cor_abl_atk(
    abl varchar(16) not null, --攻撃するときにタイプ補正がかかる特性
    attr varchar(8) not null,--技タイプの英語名
    cor real not null --攻撃するときの補正値
);

cor_ability_def(name=ability.name) 特性補正表(防)

--攻撃されるときにタイプ補正がかかる特性の一覧
create table if not exists cor_abl_def(
    abl varchar(16) not null, --攻撃されるときにタイプ補正がかかる特性
    attr varchar(8) not null,--技タイプの英語名
    cor real not null --攻撃されるときの補正値
);

 

その他のデータベース

sqlcmd(name) 「?」から始まるSQLコマンドを管理するテーブル

※discordからも操作できるようにINSERT権限を与える

--「?」から始まるSQLコマンドに関する情報の一覧
create table if not exists sqlcmd(
    id int default 0, --各コマンドの表示優先順位
    name varchar(16) primary key, --コマンド名
    cmd text not null, --コマンドに対応するSQL文
    text text default '未編集', --コマンドの説明
    i1 varchar(8) default '-', --引数1
    i2 varchar(8) default '-', --引数1
    i3 varchar(8) default '-', --引数1
    o1 varchar(8) default '未編集', --出力1
    o2 varchar(8) default '-', --出力2
    o3 varchar(8) default '-' --出力3
);