LoginSignup
0
1

More than 1 year has passed since last update.

こんなRDBMSはいやだ 〜 データベースの使い方アンチパターン 〜

Posted at

はじめに

今までに出会った、実際にあったデータベースの使い方を列挙してみます。

SQLアンチパターンでも拾いきれない、さすがに想定外の使い方ではないかと思われます。

良い子の皆様にはショッキングな内容と想像されます。
心の弱い方はそっと閉じてください。

正規化されていない

正規化されておらず、同じ値があちらこちらにあると、更新処理が無駄に長大なトランザクションになります。
仕様を把握しにくくなり、バグの温床になります。

大昔は、パフォーマンスのためにあえて正規化を崩す(テーブル結合せずに値をとれるようにする)という手段もありましたが、今でも通用するでしょうか?

主キーがない

テーブルに主キーがないと、更新対象行を一意に特定できているのかどうかわかりません。
テーブルに主キーがないと、プログラムから使おうとしたとき、面倒な手数が増えます。

外部キー制約がない

これはSQLアンチパターンに掲載ありましたね。
外部キーなくして、なんのためのRDBMSかという。

インデックスがない

インデックスがないと、全行検索になってしまいます。

連番専用テーブルを使う

連番が欲しいのならば、データベースの機能を使ったほうがよいです。
単にユニークな値が欲しいのなら、プログラム側からGUIDを格納してあげたほうが幸せです。

どうしてもというのであればフォーマンスを考慮してください。デッドロックにも注意です。

数値が全部NUMBER型

intとかbitとか、用途に合わせて型を選ぶべきです。

大抵はO/Rマッパを使うのでしょうから、データ型はコードから生成してあげたほうがよいです。

日付/日時を文字列で格納している

パースしないと日付/日時として扱えないのは不便過ぎます。
比較も難しいです。
タイムゾーンへの対応も難しいです。

一周回って、逆にデータベースの日付型が貧弱過ぎるから自前でやる、というのはありです。

2022年にもなってShiftJIS

新規構築するシステムでUnicodeを選ばない理由はありません。

鯖の異体字 鯖󠄄 を保存したくなるシーンはないでしょうか?

テーブル名/列名を無理に略す

長さ制限にひっかからないのであれば、無理に略さなくてもよいですよ。
パッと見で意味を汲み取れません。

闇雲に作成日/更新日列をつける

とにかく全てのテーブルに作成日/更新日列をつけます。
さらに作成者/更新者、作成プログラム/更新プログラムのような列がつけられることもあります。

テーブルの趣旨にあわせて、その列が必要かどうか判断してください。

監査/トレース目的なら、また別の方法を検討したほうがよいです。

ストアドプロシージャが巨大すぎる

データベースに負荷をかけるような処理は、なるべく控えたほうがよいです。
増強が難しくなります。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1