先日とある『不動産検索システム』をつくりまして、
『不動産検索システム』をつくるにあたり、考えたこと、やったことなどを書き連ねてみようかと思います。
今回のお題は『データベース』。
不動産に限らず、何か情報を探そうとするなら、
データが集まった『データベース』が必要になります。
今回は不動産をお題に、最低限必要な『データベース』構成について書いてみることにします。
検索システムのデータベースの作り方 その0 前提条件
検索システムのデータベースの作り方 その1 要件のヒアリング
何はともあれ、どんな検索システムを作りたいかのヒアリングから。
今回は、タッチ操作で選ぶことができるシンプルな『不動産検索システム』がご希望とのことでした。
賃貸 もしくは 売買 のどちからから選んで、検索条件として、
賃貸の方は3種類から選択できて、
- 路線
- エリア
- 間取り
売買の方は4種類から検索したいということで。
- 路線
- エリア
- タイプ
- 金額
タッチパネルなので、文字を入力したりすることはせず、
画面をタッチするだけで検索できる、というのがウリになります。
検索システムのデータベースの作り方 その2 必要な情報の洗い出し
次に、必要な情報を集めます。
今回の『不動産検索システム』では、実際に見てもらえるとわかるのですが、
これらの情報が必要ということになりました。
- 物件名
- エリア (検索条件)
- 価格 (検索条件)
- 間取り (検索条件)
- 種類 (検索条件)
- 路線 (検索条件)
- 敷金
- 礼金
- 保証金
- 敷引・償却
- 所在地
- 駅徒歩
- 専有面積
- 設備
- 間取り詳細
- 構造
- 階縦
- 築年月
- 損保
- 駐車場
- 入居
- 取引態様
- 条件
- 取扱店舗物件コード
- 総戸数
- 仲介手数料
- 保証人代行
- ほか諸費用
- 備考
- バナー
- 画像
- 表示/非表示
ずらっと32種類。
当初はもっと少ないお話だったのですが、
何度かクライアント様と何度かやりとりをしていくうちに
これらの情報が必要ということになりました。
検索システムのデータベースの作り方 その3 データ型
次にやっておきたいのがデータ型の指定。
- 文字型(String)なのか(文字なら最大何文字か)
- 数字型(Integer)なのか
- boolean型なのか(trueかfalse)
などですね。
文字数に関しては、文字数が大きいほど容量もとってしまうので、いいあんばいで。
数字に関しては、今回の場合『金額』が検索条件に入っていて、
例えば『3000万円以上』という検索条件があったので、金額に関しては数値型が必須でした。
他はほぼ文字型で、表示非表示という箇所だけboolean型にしておきました。
例えば物件が売れた時にデータを消してしまうと、
いつ売れたのかというのが履歴に残らなくなってしまうので、
表示->非表示と変えることで、
画面上からは消すものの、データとしては残っている状態をつくっています。
また、余談にはなりますが、
小数点を含む数値計算の場合、
- float ・・(単精度浮動小数点型)
- double ・・(倍精度浮動小数点型)
- decimal ・・(固定小数点)・・最も精度が高いけれど遅い
と3タイプの型があり、それぞれ特性が違うので要チェックください。
検索システムのデータベースの作り方 その4 項目の名前
次に大事なのはそれぞれの項目の名前。
数ヶ月経った後でも見てわかるような、できるだけわかりやすい名前をつけておくと、
プログラミングを書くときにも楽になります。
日本語でもかけなくはないのですが、基本的には英語での記載がよいとされています。
正解はないですが、こんな感じかと思います。
エリア -> area
物件名 -> name
所在地 -> address
路線 -> line
専有面積 -> size
間取り -> floor_type
プレゼント -> present
損保 -> insurance
英語で調べつつ、重複しない名前を決めていきました。
検索システムのデータベースの作り方 その5リレーション
『MySQL』などのデータベースでは、
『リレーション』や『正規化』を使うことが望ましいとされています。
『リレーション』・・・関連するテーブル同士をつなげる
『正規化』・・・ データを一定の規則で整理(第3正規化まで実施したい)
まずは『リレーション』から。
『リレーション』には3つの種類がありますが、
- 一対一
- 一対多
- 多対多
今回は下記のような検索が必要でしたので、
不動産テーブルを軸に、それぞれを外部テーブルに分けることにしました。
- エリア ・・ 一対多 ( 東京都中央区、江東区、葛飾区など)
- 間取り ・・一対多 (1K、1LDK、2LDKなど)
- 種類 ・・一対多 (マンション、アパート、戸建など)
- 路線 ・・多対多 (山手線、中央線、東京メトロ銀座線など)
また、検索条件ではないものの、設備に関しても『多対多』でつなぐことにしました。
- 設備 ・・多対多 (キッチン、ペット不可、男性限定、オートロックなど)
『一対多』の判断基準としては、
物件に対し、いくつかの選択肢の中で、一つだけあてはまる場合が対象で、
例えばエリアなら、中央区か江東区か葛飾区のどれか一つ、となります。
『多対多』は、
物件に対し、いくつかの選択肢が複数あてはまる場合が対象になります。
例えば路線の場合、山手線と中央線が通る駅もあったりしますので(新宿とか秋葉原とか)、こういう時は『多対多』の出番です。
外部テーブルに分けておくと何がいいかというと、
後からデータの追加がしやすい ことかなと思っています。
例えば後から、
となった場合でも、外部テーブルに分けておけば、外部テーブルに追加するだけで済むので。
また、今回は『多対多』のテーブルを2つ作る必要もありましたので、別記事にしています。
検索システムのデータベースの作り方 その6 正規化
正規化はこちらのサイトにも説明がありまして、
第3正規化まで実施するのが望ましいとされています。
- 非正規化状態・・全く正規化が行われていない状態のテーブル
- 第一正規形・・非正規形のテーブルを、繰り返し現れる列がない状態
- 第二正規形・・主キーとなる列の値が決まれば、他の従属する値が決まるようにテーブルを分割した状態
- 第三正規形・・主キーとなる列以外の値によって、他の非主キー列の値が決まることがない状態にテーブルを分割した状態
ってことかなと思います。
もしデータの変更が起こっても最小限の変更で抑えられるので。
検索システムのデータベースの作り方 その7 パーティションとインデックス
データベースにはそれこそ数百万、数千万という膨大なデータを保存できるのですが、
データが増えれば増えるほどどうしても検索に時間がかかり、
パフォーマンスが落ちてくる場合があります。
データが数百万を超えたあたりからパフォーマンスが落ちてくる体感があるので、
もしデータベースの保存数が先々 数十万、数百万、もしくはそれ以上と想定される場合は、
前もって『パーティション』『インデックス』といった機能を設定しておいたほうがよいです。
『パーティション』・・テーブルを分割する機能(年単位で分割など)
『インデックス』・・索引、検索する目印をつけることで検索速度向上を図る
検索システムのデータベースの作り方 その8 バックアップ
例えば急な停電、大規模な地震など、
なにかしらの原因でデータの一部が消えてしまう、ということは起こりえます。
その場合に備えて、『データベースのバックアップ』は抑えておく必要があります。
『MySQL』なら『mysqldump』というコマンドがあるので、
これをサーバーの定期実行プログラム『cron』などを使って、1日1回、1ヶ月間保存など設定しておくと安心できるかなと思います。
検索システムのデータベースの作り方 というより実際のアクセス方法
正規化までしっかり意図してデータベースを構築できたら、
あとは create や update でデータ保存して、
select でデータ呼び出して、
groupby やら order by で条件抽出して、という手はずになります。
参考までに関連記事を載せておきます。
また、PHPのなんでもありなフレームワーク『Laravel』なら、
ダミーデータも簡単につくれるので、それこそ数百万のダミーデータをつくって
『パーティション』の実験などをやってみるのもいいかもしれません。
検索システムのデータベースをつくってみた感想
今回の『不動産検索システム』では、
文字を入力する形での検索機能はつけていませんが、
『リレーション』『正規化』をしっかりとつくっておくことで、
後からの変化にも強い『検索システム』がつくれたかなと思います。
検索システムのデータベースをつくった時の参考文献
- 失敗から学ぶRDBの正しい歩き方
実際のデータベースの現場でよくあるミスについて細かくかかれています。
- 楽々ERDレッスン
データベースのリレーションに自信がないならこちら。
病院の領収書、ハンバーガーショップのレシート、図書館の予約申込書などを例に、わかりやすくリレーションの基礎を知ることができます。
- システム設計のセオリー
システムを作ろうと思ったらデータベースはもとより『システム設計』全般の知識を広く知っておいたほうがしっかりとしたシステムがつくれるようになります。
『mysql』関係ではこんな記事も読まれています。
1. 【mysql】SQL文のつくり方のコツ〜ちょっとずつ組み立てる〜【初心者向け】2. 【mysql】2つの条件でまとめて数値を合計したい【初心者向け】
3. 検索システムのデータベースの作り方や考え方を8ステップで書き連ねてみる
アオキのツイッターアカウント。
この記事へのコメントはありません。