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

SQLのチューニングに関して

ここ2か月ぐらいはSQLの本でがりがり勉強してきましたね。当然復習も必要かと思いますが、だいぶいろんなことを覚えたなあという気がします。 一番勉強になった本はもちろん「達人に学ぶ SQL徹底指南書」と …

no image

SQL基礎 ウィンドウ関数

SQLの基礎(主にSELECT)を whereはレコードに対しての集計、havingはレコードの集合に対しての集計 ビューは一時的なselect文なのでサブクエリとほぼ等価 条件分岐で出力項目を変えた …

no image

フィールド以外のプロパティをエンティティに持たせる

JPAでは基本的に1テーブル、1クラスです。 このためプロパティは必然的にテーブルのフィールドに対応しています。 ただ、必ずしもプロパティだけでなく、臨時で持たせておきたい、プロパティがあったりします …

no image

SQL基礎 結合に関して

SQL実践入門を読んで勉強しておりますが、本日は結合に関して。 Contents1 クロス結合2 内部結合3 外部結合4 結合のアルゴリズムとパフォーマンス4.1 NestedLoops4.2 Has …

no image

第二、第三の正規化&ER図&Check制約

前回第一正規化を話したので、第二、第三に進んでいきます。 Contents1 第二正規化とは?2 第三正規化とは?3 正規化のメリット4 ER図5 本日のSQLネタ Check制約 第二正規化とは? …