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

スクラム開発をやってみて

アジャイルの定義に関してはエンジニアによって色々なものがあると思われますが、自分の場合一番綺麗に説明されているな・・・と感じたのは以下の記事でも紹介した書籍でした。 アジャイル開発について 現場ではた …

no image

浮動小数点に関して

金額計算なんかでfloatを使うと誤差が出るっていうのは基礎的な話ではありますが、背景知識を含めて理解しておこうと思ったのでメモります。 Contents1 float,doubleでの誤差2 金額の …

no image

MariaDBインストール

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

no image

オブジェクト指向設計 単一責任のクラスの設計

オブジェクト指向をするうえでの大事なポイントなど Contents1 単一責任のクラス設計1.1 メモ1.2 実際のコーディング上のコツ1.3 感想1.4 参考文献 単一責任のクラス設計 メモ 単一責 …

no image

postgresの外部キー制約やcascadeについて

外部キーを貼っておくと、当然、削除などを行うときにエラーになり、truncateも当然できなくなりますが、cascadeをつけることで、関連するテーブルまで一気にtruncateされます。 [cray …

アーカイブ