質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

3回答

4111閲覧

20個足らずのマスターデータでもデータベースに保存するべきでしょうか?

nemosan

総合スコア13

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

1クリップ

投稿2016/04/03 10:33

id, title, price, slugの4つのフィールドを持つItemクラスがあります。現在自分が扱っている商品は20個足らずで、今後増えても30個はまず超えません。

このような少数のデータであっても、データベースに保存すべきでしょうか?

現在は以下のようにクラスに定義しています。

php

1<?php 2 3class Item 4{ 5 private $id; 6 private $title; 7 private $price; 8 private $slug; 9 10 public function __construct($id, $title, $price, $slug) 11 { 12 $this->id = $id; 13 $this->title = $title; 14 $this->price = $price; 15 $this->slug = $slug; 16 } 17 18 // 以下getter省略 19} 20 21class ItemRepository 22{ 23 private $items; 24 25 // id 26 const ITEM_A = 1; 27 const ITEM_B = 2; 28 const ITEM_C = 3; 29 // 以下略 30 31 private static $itemList = [ 32 self::ITEM_A => [ 33 'title' => 'hoge', 34 'price' => 500, 35 'slug' => 'fuga', 36 ], 37 // 以下略 38 ]; 39 40 public function __construct() 41 { 42 foreach (self::$itemList as $id => $item) { 43 $this->items[$id] = new Item( 44 $item['id'], $item['title'], $item['price'], $item['slug'] 45 ); 46 } 47 } 48 49 public function find($id) 50 { 51 if (isset($this->items[$id])) { 52 return $this->items[$id]; 53 } 54 throw new \InvalidArgumentException('不正なID'); 55 } 56 57 public function findBySlug($slug) {//省略} 58}

また、あわせてお聞きしたいのですが、ItemRepositoryクラスについてもっといい書き方は無いでしょうか?

コンストラクタでItemのインスタンスをセットしてるのがちょっとイケてない気がしています。

よろしくおねがいします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

以下の観点で判断してみるとどうでしょうか?

  • どの方法が自分達にとって全体のシステム制御が楽になるのか?
  • どの方法が今後の保守や運用といった面が容易になるかどうか?
  • 扱っているマスタ定義の置き場所はどこに集約するのが(感覚的に)自然か?

もし、小規模・短期運用であれば、好きなやり方で構わないでしょう。そこまで考えて開発を行う事自体が無駄になるほどコスト的な影響も無いはずです。他にデータベースで扱っているマスタデータが存在し、一貫性を持たせた方が良いと感じるなら、データベース上に置くべきです。データベース以外にシステム設定ファイルなりのマスタ定義に適した場所が存在していれば、それを使うのも手でしょう。

ただし、無理に分離して管理対象を増やすのは、結果的に運用時の調整や手間で痛い目を見るだけなので、定義する場所の集約は適切な規模・範囲で行うべきです。客観的に説明がつくかどうか?も指標として使えるかもしれません。

結果的にはシステムのあるべき姿を捉えると自ずと答えは出るはずです。

蛇足にはなりますが、オブジェクト指向での immutable な概念を齧っていないのであれば軽く齧ると良いでしょう。PHP の言語特徴を考えると少し馴染みにくい概念な気もしますが、定義の見え方そのものが広がると思います。

以上、ご参考になれば幸いです。

投稿2016/04/03 12:18

ps13zier

総合スコア433

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nemosan

2016/04/04 01:59

immutable、勉強してみます
guest

0

もちろんjsonなりconfig.php等のファイルなりに記載しておく手段もあります。

個人的な意見を言うと、マスター情報は明細と同じデータベースにぶち込んだ方が何かと楽です。
例えば売れ筋商品が欲しい時、RDB(MySQL)にマスタの情報を登録しておけば
一撃で売れ筋商品の一覧が名前や発売日等の付帯情報付きで取り出せます。

別の項目で保存していた場合、
DBに接続して売れ筋商品の情報とマスタIDを元に、
自分でfor文回してマスタの商品名・発売日等の情報を取得する必要があります。


追記:ItemRepositoryクラスに関して

素晴らしい!
行クラスとテーブルクラスもちゃんと分かれていますし、こいつ単体でいえば何も言うことはありません。

コンストラクタでItemのインスタンスをセットしてるのがちょっとイケてない気がしています。

現在形で特に問題ないと思います。
まぁ、マスターのデータ更新でプログラムの行数が増減するのはよろしくないので、
外部ファイル化させてさせてうまいことやる設計の方がクールでしょう。

行クラスをもっと活かす

もしfindBySlugの中身がforeachでぶん回してif($item->getSlug() === $slug)とかやってたらNGです。
ItemRepositoryクラスがやるべきことは、個々のItemさんに挙手してもらうことです。
こうすると例外パターンが出現した時にロジックを変更する必要があるのは常にItemとなるので、
問題の切り分けが楽になります。

PHP

1class Item { 2 function slug_is($it) { 3 return $this->slug === $it; 4 } 5} 6 7class ItemRepository { 8 function find_by_slug($slug) { 9 return array_filter($this->items, function($it) use($slug){return $it->slug_is($slug);}); 10 } 11}

もし更に改良を加える場合

結論から言うと、良い抽象化とマジックメソッドが鍵となるでしょう。
考える方向性としては同じようなテーブル的なものを複数作成する必要が出てきた場合の考慮でしょう。

例えば似たようなまた別のテーブルが必要になったら、
プログラムの設計は統一すべきなので似たような構造で作りますよね?
そうすると、コンストラクタメソッドの引数がバラバラになってまず困るわけですよ。

また、変数名も意識したほうが良いかもしれません。
ItemRepositoryクラスにとってのレコードとはitemsでこれはこれで具体的で二重丸な良い名前ですが、
担当者リストのStafRepositoryクラスが新設されたら同じようにitemsでいきますか?stafsになりますか?

もし私が仮に後輩にレビューして修正指示を出すのであれば、
重複部分を纏めてcommonRepositoryという汎用クラスを作成して、
itemsではなく、recordsという変数名で管理するように指示します。

もしくはカラムの構造が変化した場合の考慮です。
カラムをちょっと弄るだけでも10行単位で変わりますよね?

投稿2016/04/04 02:19

編集2016/04/04 04:55
miyabi-sun

総合スコア21158

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

miyabi-sun

2016/04/04 05:55

将来を見据えた上で自分ならこうする程度に書きました。 仮にこれを採用したとしても、 今度はItemテーブル1個にどんだけ工数掛けるんねんって問題があるので参考程度でどうぞ。
guest

0

現状で問題ないならいいんじゃ?
しいていえば、設定ファイル等を別途設けて
それを処理時などに読み込むようにすれば、
ロジックとの分離ができていいかも。

投稿2016/04/03 11:28

takasima20

総合スコア7458

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問