sango

This text briefly introduces the content in the page.
Uncategorized

【DB設計】『達人に学ぶDB設計徹底指南書』に学ぶ、アンチパターン

はじめに データベースの設計は基本設計の中でもかなり重要な工程です。特にデータの構造によってアプリケーションが決まるため、データベース設計での失敗をアプリケーションで改善することはできません。今回は『達人に学ぶDB設計徹底指南書』で指摘されているアンチパターンをピックアップして紹介します。 アンチパターン 非スカラ値の格納(第一正規形未満) 【症状】第一正規形はデータベースの原則である、テーブルに含まれるすべての値がスカラ値であるという原則を無視した「複数の値」をセルにいれること 【なぜ起こるか?】開発者がRDBに柔軟なデータ型が欲しくなり、実装してしまった…など 【問題点】 【対策】 ダブルミーニング 【症状】value カラムには「身長」と「体重」の両方入っている 【なぜ起こるか?】途中からvalueカラム(身長)が不要となり、「体重」が必要となったため、列の使い回ししたくなった…など 【問題点】 【対策】 単一参照テーブル 【症状】部署や会社といった別の意味を持つものを構造的に似ているということで一つのテーブルにまとめてしまう。 【なぜ起こるか?】数百テーブルがある状況において、同じ構造を持ったテーブルを一つのテーブルにまとめることで効率化を図った…など 【問題点】 【対策】 テーブル分割 水平分割 【症状】レコード単位でテーブルを分割してしまうこと例えば2010年用のテーブルと2011年用のテーブルなど、、、業務系のトランザクションテーブルに多い 【なぜ起こるか?】何百万〜何十億とレコードが積み重なったときI/Oコストの増大が発生し、そのパフォーマンス改善を狙って分割してしまう 【問題点】 【対策】 垂直分割 【症状】列を軸にテーブルを分割してしまうこと例えば、社員テーブルを「社員ID・年齢」と「社員ID・名前・部署コード」といった形で分割してしまう。 【なぜ起こるか?】I/Oがボトルネックになったときのパフォーマンス改善として、実装されてしまう。 【問題点】 【対策】 最後に これまで紹介させていただいたアンチパターンは、自分自身も実際に現場で目にした例も多かったです。そして、バックエンドエンジニアとして業務経験が浅かった頃は、1列に集約関数実行後の値をjson文字列で格納した変なサマリーテーブルを作ったことも有りました。。。そのような実装をしてしまう前にアンチパターンを知っておくことで事故を防ぎ、今後の保守や運用の効率が上がって行くかと思います。この記事が少しでも皆さんの設計のヒントになれば嬉しいです! 参考文献

Uncategorized

PHPとの比較から学ぶGo言語の設計思想 〜メソッドの定義方法・継承と合成・ポリモーフィズムの実現方法の違いを徹底解説〜

はじめに プログラミング言語の中でも、Go言語(Golang)は比較的新しい言語でありながら注目度を高めています。その背景には高い保守性と柔軟なコード設計を支える独特の言語仕様があると考えられます。 本記事では、PHPと比較しながらGo言語の設計思想を解説していきます。メソッドの定義方法、継承と合成の違い、そしてポリモーフィズムの実現方法を具体的なコード例とともに取り上げ、オブジェクト指向経験者でも理解しやすい形でGoの特徴を掘り下げます。 Go言語の最大の特徴とは? 多くのオブジェクト指向言語では、クラスを定義し、それを継承して機能を拡張します。一方、Goにはクラスや継承の概念がありません。その代わりに「構造体(struct)」と「インターフェース」を組み合わせてプログラムを設計します。 この設計により、以下のような利点があります。 構造体とは? Goの構造体の説明に入る前に、まず以下のGoで書かれたコードに注目してください。 Go言語では、他の言語と同じようにデータを扱うときは変数を使うことが可能です。ここでは太郎さんの身長と年齢の情報を用意し、年齢を標準出力しています。 ただ、以上のような例では太郎さんの身長と年齢が個別の変数で定義されているため、データをまとめて管理することが難しくなります。このような問題に対して、Goでは「構造体」を使うことでバラバラのデータを1つにまとめることができます。 このように、Goの構造体は「複数の値を1つにまとめる」仕組みです。PHPのクラスに似た役割を果たします。 ここまでを踏まえて、Goの構造体とPHPのクラスの共通点をまとめると以下のようになります。 構造体とクラスの共通点 また、Goの構造体とPHPのクラスの違いをまとめると以下のようになります。 構造体とクラスの相違点 PHPのクラス Goの構造体 メソッドの定義方法 クラスの中で定義する クラスの外で定義する コードの再利用方法 継承 埋め込み(合成) ポリモーフィズムの実現方法 インターフェースを明示的に実装 インターフェースを暗黙的に実装(メソッドが一致すればOK) 次章からは、この「メソッドの定義方法」、「コードの再利用方法」、「ポリモーフィズムの実現方法」それぞれについてより詳しく解説していきます。 PHPとGoのメソッド定義方法の違い PHPではクラス内にメソッドを定義します。一方、Goでは構造体の外でメソッドを定義して紐づけます。 この違いはコードの依存関係や再利用性に大きな影響を与えます。Goの方法は疎結合を実現しやすく、保守性が高まります。以下にPHPのクラスとGoの構造体それぞれのメソッド定義方法を紹介します。 両者とも「名前を持つユーザーを表現」し、greet メソッドで挨拶を返すという共通点があります。ただし、Goでは メソッドを構造体の外に定義して紐づけるのが特徴です。 コードの再利用方法の違い ― 継承と合成 PHPの場合 PHPでは継承によって親クラスの機能を子クラスに引き継ぎます。しかし、継承は親クラスの変更が子クラスに波及しやすいため、保守が難しくなることがあります。 Goの場合 Goでは構造体に別の構造体を埋め込む「合成(埋め込み)」を使って構造体同士を組み合わせます。必要な機能だけを柔軟に取り込めるため、より保守しやすい設計が可能です。 継承は便利な反面、親クラスの変更が子クラスに波及しやすく保守性が下がることがあります。Goの「合成」は必要な機能だけを組み合わせるため、変更の影響範囲を限定でき、保守しやすいのが利点です。 ポリモーフィズムの実現方法の違い ― 明示的 vs. 暗黙的な実装 PHPの場合 PHPではインターフェースを明示的に実装しなければなりません。 Goの場合 Goでは暗黙的にポリモーフィズムを実装できます。構造体のメソッドがインターフェースのメソッドと一致していれば、構造体は自動的にインターフェースを実装したことになるため、コードをシンプルに保ちながら柔軟性を確保できます。 この仕組みにより、開発者は「インターフェースを実装している」ことを明示しなくても自然にポリモーフィズムを実現できます。結果として疎結合なコードが書きやすく、テストや再利用の柔軟性が向上します。 Go言語の最大の特徴 改めてGoの構造体とPHPのクラスの違いをまとめます。 構造体とクラスの相違点 PHPのクラス

Do you want to boost your business today?

This is your chance to invite visitors to contact you. Tell them you’ll be happy to answer all their questions as soon as possible.

Learn how we helped 100 top brands gain success