skillup

技術ブログ

Database

論理設計のアンチパターン

投稿日:

今回からは論理設計のアンチパターンについて。

やってはいけない設計のパターンですね。これはまわりがやっていると気づかずにやっている可能性があるのでしっかりメモしておきたいです。

非スカラ系の値

これはテーブルに配列の値が入っているものです。

例としては下記のようなテーブルです。

社員ID 社員名
001 山田 太郎
次郎
002 鈴木 太郎
次郎
三郎

こういったパターンは見たことがないですね。ただテーブルの中にカンマやアンスコ区切りで複数の値を入れているのをみたことはあるので概念としては同じかもしれないです。しかもSQLのデータ構造として配列型というものがあるらしいですね・・・使ったことはありませんが。

原則としては「配列型は使わない。第一正規系を使う」というのが正しい考え方のようです。

また人名のようなものはなるべ分割していれたほうがあとあと楽ですね。分割→結合は楽ですが、結合→分割は大変だからです。情報は意味を壊さない程度に分割して保存するようにしましょう。

ダブルミーニング

ID 列1
001 山田 170
002 鈴木 50

ダブルミーニングとは一つの列で別の意味をもたせることです。001番は列1は身長で、002は体重みたいな。ここまで露骨なものはさすがに見たことはないのですが、大局的に意味が近いものはやろうかなとおもったことはありましたね・・・(汗)

プログラマが変数を使うようにテーブルの列を変数とみなすことでこのようなことが生まれるケースがあるようです。

列は変数ではなく、一度意味を決めたら変更不可にしましょう。

単一参照テーブル

コードタイプ コード コード名
com_cd C001 A商事
com_cd C002 B商事
pref_cd P001 北海道

単一参照テーブルというのはテーブル数を少なくするという意図で複数のマスタを同一テーブルで管理するという手法のようです。

オブジェクト指向の多態性の考え方をテーブルに持ち込んだもののようですね。

メリットとデメリットをまとめると以下のようになります。

メリット

  • マスタテーブルの数がへるため、ER図やスキーマがシンプル
  • コード検索のSQLを共通化できる

デメリット

  • データの長さを大きめにとっておく必要がある
  • レコード数が大きくなりパフォーマンスに悪影響がでる
  • コードのSQLでコートタイプやコード値を間違えてもエラーにならず、バグに気づきにくい

基本的にはしないようがいいようですね。テーブルに多態性を持ち込んではいけないようです。

 

-Database
-

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

no image

サブクエリの使い方

以前も少し学習しましたが、今回からはサブクエリの扱い方です。特に異なった行の比較(年度計算など)に関して行われる自己結合をつかったものが非常に強力です。 例によってここを学習しています。 下記のような …

no image

SQL基礎 case式について

case式に関して。 集約系の関数では複雑な処理を一気に行うことができる。 case式は1列のみ有効。複数の列に対して行うことはできない。 case ~ when ・・・thenではwhenが評価され …

no image

オプティマイザと実行計画

データベースがSQLを受け取って処理を実行する前には下記のような段階があります。 Contents1 パーサー2 オプティマイザ3 カタログマネージャー4 テーブルからデータの取得5 参考リンク パー …

no image

論理設計のアンチパターン その2

今回は論理設計のアンチパターンの続きです。 今までに比べると何も意図がないというものではなく、パフォーマンスを考えて設計されているようなものが多いです。 ただし、中には絶対に許されないタイプのものもあ …

no image

EXISTSについて

今回はEXISTSについてです。 実務では伝票と明細との検索関連の処理で結構出てきます。 なお、達人に学ぶ~では論理学について少しふれており、この領域を本気で理解する場合は論理学を勉強する必要がありま …