LoginSignup
0
0

More than 1 year has passed since last update.

【要約】DB設計のアンチパターン

Posted at

はじめに

第7章;論理設計のバッドノウハウ
を要約しました

1. 非スカラ値

スカラ値・・・1つのセルには1つの値のみが含まれること
スカラ値でない場合、第一正規系を満たしていないことになる。

  • 配列型
    • 安易に配列型を採用するのではなく、第一正規化を確保することを優先すべき
    • 配列型は柔軟なデータ型ではあるが、細心の注意が必要
  • スカラ値の基準
    • 意味的に分割できる限りは、なるべく分割した方が良い(後で、分割は大変だが結合は楽なため)
    • 例)名前や、メールアドレスなど分割して保持
      • 高橋健二 ・・・ 「高橋」「健二」
      • test@gmail.com・・・「test」「gmail.com」

2.単一参照テーブル

同じ構造のテーブル同士を1つのテーブルにまとめても良いのか?

スクリーンショット 2023-03-26 22.41.01.jpg

1つのレコードがある時は、会社名、あるときは、都道府県を著しています。

利点よりも欠点の方が多いのが実際の所。

利点

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

欠点

  • 必要とされる列長はコード体系によって異なるため、大きめの可変長文字列型を取る必要がある
  • 種類が多いため、レコード数が増えるのでパフォーマンスに影響を与える
  • 上の例で言うと、コードタイプを間違えて検索しても、エラーが出ずにバグに気づきにくい
  • ER図としての可読性が下がる

テーブル分割

  1. 水平分割・・・レコード単位のテーブル分割
  2. 垂直分割・・・列単位のテーブル分割

水平分割

SQLのパフォーマンス低下が起きる原因は、ストレージに対するI/Oの増大です。
そのためアクセス量を減らすことでパフォーマンスが改善さえます。

例えば、年度毎に水平にテーブルを分割することで、データ量を減らすことが出来る

しかし

欠点もあるので、分割はする事は原則禁止です。

  1. 欠点: 分割する意味的な理由が無い
  2. 拡張性に乏しい
    • 分割するなら、分割した全てのデータをまとめて検索しないことが前提になる
  3. パフォーマンス改善をしたいなら代替え手段がある
    • パーティション機能を利用すれば良い。データ量を1/nに減らすことが出来る

パーティションの種類

  • レンジパーティション
    • キー項目の範囲で指定する
    • 例)日付毎に分ける
  • リストパーティション
    • 任意の値リストを指定することで分割する
    • 例)都道府県ごと
  • ハッシュパーティション
    • ハッシュ関数を利用することで分割が可能
    • 不連続なデータを均一に分割する際に使用する

垂直分割

集約で代替えが可能

集約

  1. 列の絞り込み
  2. サマリテーブル

列の絞り込み

  • データマート
    オリジナルのテーブルから、分割するのではなく
    参照した列だけで構成した、小規模なテーブルを作成する。
    DWHなどでよく使われる手法

サマリテーブル

事前に必要な情報だけ集約したテーブルを作成しておく。
例)全社員の平均年齢だけをもったテーブル

不適切なキー

  1. 主キー、外部キーなどデータベース機能で設定されるもの
  2. テーブルの結合条件で使用される列

この2つのキーには、可変長文字列を使ってはいけない。
なぜなら、

  • キーは不変性であること
    • コロコロと変わる値をキーにはしない
  • 固定長との混合
    • キーには固定長が望ましい

同じ役割のテーブルが2つ存在する

なぜ、このようなことが起こるのか?

それは、元々別システムで扱っていたが、システム統合によって同じドメインを扱うようになった場合です。

どのような悪影響があるか?

例えば、同じデータ構造の2つのテーブルで一部異なるデータが入っている場合。
全てのデータから情報を得るためにはテーブルを結合する必要があります。
そして、結合はコストが高い処理です

0
0
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
0