skillup

技術ブログ

Database アーキテクト設計全般

オブジェクト指向 データベース層

投稿日:2017年7月25日 更新日:

本日も引き続き「現場で役立つシステム設計の原則」を読み進めてます。

本日は主にデータベース層の考え方について。

データべース層

要点

典型的なダメテーブル設計

  • 既存DBの問題点(意味不明なカラム、NULLが入っている、ダブルミーニング、関係がわからない、テーブルが巨大すぎ)
  • 制約(ユニークキーがない、NOT NULLがない、外部キー制約がない)
  • 1つのカラムに複数の意味と思われるデータが入っている
  • テーブル間の関係がしっかりしていない

基本的には下記のリンクでかいたようなネタ

論理設計のアンチパターン その2
論理設計のアンチパターン
データベースアンチパターン・グレーパターンまとめ

対策

  • カラム時の制約を整理(not null,FK,ユニーク他)
  • 記録のタイミングが違う場合はテーブルを分ける(正規化に従って全ての情報を1テーブルで持つ必要はない。)
  • コト(会員、入出力金額、在庫・・・)の記録を中心に行い、状態(差分の変更)の記録をできるだけ作らない
  • UPDATE文をなるべく使わず、INSERTで履歴を追加する
  • カラム追加時はテーブルの分割を考える(ただし非正規化が崩れる)
  • 複数の更新作業は非同期で行ってもよい(ただし複数のサーバー分割などデメリットもあり)
  • 集計はイベントの記録から動的に作成する(ビューや中間テーブルを使わない)
  • オブジェクトとテーブルは似てはいるが違うもの

感想

今回はデータベースがらみの話。結構いろいろな本を読んで勉強しまして、半分以上は知っている話だったんですが、UPDATEを使わないってのは初でしたね。確かに今作ってるアプリでも履歴をつくってデータを消さないってのはあるんですけど、INSERTとDELETEだけってのは聞いたことがありませんでした。私がまだ考えを理解できていないだけかもしれませんが、やや原理主義的な感じもしました。

カラムが増える場合はテーブル分割したほうが良い面もありますね。ただ1:1の構成になりますんで、非正規化は徹底されていないです。メリットデメリットをみることが大事かなと思います。

-Database, アーキテクト設計全般

執筆者:


comment

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

関連記事

no image

オブジェクト指向 プレゼンテーション層

本日も引き続き「現場で役立つシステム設計の原則」を読み進めてます。 本日はプレゼンテーション層、いわゆるMVCのViewにあたる部分。 Contents1 プレゼンテーション層の考え方1.1 要点1. …

no image

transactionが切れた場合のロックの復旧方法

transactionをスタートしたまま、commitせずにプログラムを途中で止めた場合の処理について。 不用意にプログラムを止めないようにしましょう。 Contents1 ロックのメカニズム1.1 …

no image

サブクエリ 移動平均など

前回の応用編です。 日付、入出金、残高はできましたが、ここからさらに、現在のレコードから3行以内(3行あれば3行、なければそれ以内でできるだけ)のレコードの合計値を出す計算を考えます。 結果だけ先に書 …

no image

アンチパターン 参照渡しと値渡し+キー情報の設定+同一値を複数テーブルに配置+正規化が不十分+集計表+不適切なステータス値

本日は自分がデータベースの設計をしていて気を付かないといけないなーと思った点などを。 注意点としては設計のミスは実装で取り返しにくいことが多いので極力気を付けましょう。あといろいろなテーブルのパターン …

no image

MariaDBインストール

CentOS7からはyumでmysqlをインストールするとMariaDBがディフォルトになるようです。 せっかくなので、これを機にMariaDBを使ってみました。といってもMySQLとほとんど一緒でし …

アーカイブ