by shigemk2

当面は技術的なことしか書かない

RDBにおけるバリデーションをリレーショナルモデルから考える #v_night

MySQLのサポートエンジニア

RDBにおけるバリデーションってなんだろう

リレーショナルモデルにバリデーションはない

ないが、constraintはある(制約)

constraint

評価した結果真となる条件式

  • type constraint
    • データ型が満たすべき条件 ドメインの定義
  • database constraint
    • データベース内のデータが満たすべき条件
    • 外部キーはこの一種

ドメイン

  • データ型のことをドメインという
  • 属性(カラム)が取りうる値の集合
  • 属性の値は、ドメインの要素の一つである
  • 属性の値は予めドメインに登録されている
  • そうなるようにドメインを設計する

どうやってドメインを表現するか

  • ドメインを集合として表現することは不可能に近い
  • 文字列で表現するデータが難しい
  • データサイズが大きい
  • ドメインの要素数が膨大になる

  • 列挙できるがデータサイズが大きいもの

  • 未知の値が多すぎて対処できない
  • フリーダムすぎるもの

→これらをドメインとして表現するのは不可能

妥協案 ドメインを制約で表現

  • SQL上で使用できるツール
  • check制約
  • create type
  • トリガー
  • テーブル+外部キー制約

  • 制約で、テーブルに格納するデータをフィルタリングする

データの危険性を鑑み、バリデーションが必要なのでは?

DBの出力→アプリへの入力

  • アプリケーションへ入力されたデータは適切にバリデーションしましょう
  • RDB側でバリデーションは必要なくって、アプリでやってくれ
  • RDBで出来るのは制約

ドメインの設計は超重要

  • 正しく設計すれば、アプリケーションによるバリデーションの手間が軽減される
  • 数値は数値型を
  • check制約で取りうる値の範囲を絞り込む
  • フリーダムなデータはアプリ側で確実にバリデーションを

本当に正しい値か

  • 運用設計は重要
  • データが正しいかどうかを確認するのはアプリケーションの運用者
  • ホワイトリスト方式でドメインを実装しても、この問いは完全には消え去らない
  • ユーザーのオペミスは十分にありうる

SQL≠リレーショナルモデル

この2つはちゃんと対応していない

  • リレーショナルモデル 集合論 すべて集合 集合にもとづく演算
  • SQL データベース操作言語 selectに盛り込まれたリレーション演算 モデル以外のデータの扱いおよび操作も可能

リレーショナルモデルであつかえないデータがある

  • 現実世界のアプリケーション
  • リレーショナルモデルに適合するデータとそうでないデータが入り乱れている
  • リレーショナルモデルには定石がある
  • 無理に実践すべきではない

RDBにおける制約とバリデーション

  • 制約: リレーショナルモデルの世界
  • バリデーション: リレーショナルモデルの外側の世界
  • アプリケーションと同じようにバリデーションが必要

プロシージャ内でprepareするべからず

まとめ

  • RDBにあるのは制約であってバリデーションではない
  • RDBまわりでバリデーションが必要なところ
  • アプリケーションへの入力
  • バリデーションはアプリケーション側への課題
  • リレーショナルモデルに沿わないデータやロジック