データベースの運用方針 - poi-ai/keibaAI GitHub Wiki

データ

テーブルを増やすときの方針

テーブル定義書(/script/create_ddl.xlsx)を記載する。

TODO

使うデータ型について(とメモ)

【整数型】

型名 UNSIGNEDなし UNSIGNEDあり
TINYINT -128~127 0~255
SMALLINT -32768~32767 0~65535
MEDIUMINT -8388608~8388607 0~16777215
INT -2147483648~2147483647 0~4294967295
BIGINT -9223372036854775808~9223372036854775807 0~18446744073709551615
  • 方針
    • 極力扱える範囲の小さい扱うデータ型を指定
    • INTEGER型は使わず、INTで統一させる
    • 0/1フラグやレースIDのような連続変数でないものは整数型で扱わずVARCHARで扱う

【小数点型】

列名 範囲 誤差
FLOAT -3.4x10^38~3.4x10^38 小数点以下7桁まで正確
DOUBLE -1.7x10^308~1.7x10^308 小数点以下15桁まで正確
DECIMAL 小数点以下込みで65桁
DECIMAL(65,30)まで可能
なし
  • 方針
    • 原則としてFLOATのみを使用
      • メモリ効率の面と、小数点以下7桁以下まで精度を求めるカラムはないため
      • 万が一必要になったらDOUBLE、DECIMALも使う
    • 一応UNSIGNEDは使えるが、非推奨のため使わない

【文字列型】

列名 最大長 特徴
CHAR 255バイト ・余った文字数はスペース埋めされる
VARCHAR 65535バイト ・余った文字数はスペース埋めされない
・処理速度が速い(インデックスが貼れる)
TEXT 65535バイト
(LONGTEXTは4Gバイト)
・処理速度が遅い(インデックスが貼れない)
・非常に多い文字数を格納できる
  • 方針
    • 原則としてVARCHARを使用
    • 勝手に空白埋めされるCHARは使わない。スペース埋めしたい場合はPython側で埋める
    • VARCHARで扱えないほど長い値が入る可能性がある場合はTEXTを使うが、そんなカラムは現時点ではない

【列挙型】

列名 絶対使わない
ENUM 絶対使わない
  • バグの温床になるし、見たくもないのでENUMは絶対使わない
  • 指定以外のものを弾きたかったら、VARCHAR型にしてINSERTの前にPython側でバリデーションチェック処理を追加しはじく。

【日付型】

型名 形式/範囲 特徴
DATE YYYY-MM-DD
1001-01-01~9999-12-31
・時間は取れない
・比較が簡単
DATETIME YYYY-MM-DD HH:MM:SS
1000-01-01 00:00:00~
9999-12-31 23:59:59
・日付のみ取れない
・文字列にすると大小関係がバグる
(しっかり対処しとけば問題ない)
TIMESTUMP YYYY-MM-DD HH:MM:SS
or YYYY-MM-DD
1970-01-01 00:00:01~
2038-01-19 03:14:07
・日付/日時どちらでも持てる
・自動更新が容易
・エポック秒換算なので2038年超えるとバグる
  • 方針
    • 追加日時(created_at)や更新日時(updated_at)など記録用の時間を扱うカラム、また日付と日時が混在するカラムはTIMESTUMP型を用いる
    • 上記以外で日付を扱う場合はDATE型、時間まで扱い場合はDATETIME型を用いる

テーブル定義書を書いた後にやること

テーブル定義書(/script/create_ddl.xlsx)に記載後、script直下からddl.pyを実行で下記処理が行われる

  • 記載した定義書が、/docs/definition/<テーブル名>.xlsxとしてコピー
  • 定義書に沿ったDDLが /src/sql/<テーブル名>.sqlとして生成
  • 定義書に沿ったEntityファイルが/src/entity/<テーブル名>.pyとして生成
  • create_ddl.xlsxが未記入の状態に

バリデーションチェックとかは入れてないので、通るかのチェックは自分で行ってね。

(未実装。 #13 で実装予定。closeになってたら使えます)

⚠️ **GitHub.com Fallback** ⚠️