テーブルを増やすときにやること - 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は使えるが、非推奨のため使わない
- 原則としてFLOATのみを使用
【文字列型】
列名 | 最大長 | 特徴 |
---|---|---|
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になってたら使えます)