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

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

ただいまの
回答率

90.61%

  • PHP

    19851questions

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

  • MySQL

    5694questions

    MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHPとMySQLで検索システムー2つの要素から該当する記事を表示

受付中

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 751

twin_bird

score 205

PHPとMySQLを一通り学んだのですが、まだまだデータベースの設計は勉強不足なのようで、アドバイスを頂きたく思います。


電車の「線」と「駅名」を選択すると該当する「記事(タイトルと記事名、線、駅名)」が表示される検索システムを作りたいと考えています。

ex. 「南武線」「川崎駅」 → 記事A、記事B、、、 (検索結果は一つは限りません。)

そこで
「線」と「駅名」で1テーブル、 「記事」で1テーブルとし、それらのテーブルを関連付ける?やり方がデータベースで重複を防ぐ最善策かと思ったのですが、その関連付ける方法がわかりません。。。



テーブルを分けた場合に両者を関連づける方法、またはもっと単純明快なテーブルの作り方などがあればお教えください。
よろしくお願いします。


※言葉足らずの部分があるかと思いますが適宜説明を加えさせていただきたく思います。
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+1

自分だったら、基本的には、以下のように設計します。インデックスとかは省略してます。

CREATE TABLE `ARTICLES` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `station_id` int(11) DEFAULT NULL,
  `content` varchar(1000) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;


CREATE TABLE `LINES` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `line_name` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;


CREATE TABLE `LINK_LINE_STATION` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `line_id` int(11) DEFAULT NULL,
  `staion_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;


CREATE TABLE `STATIONS` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `staion_name` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

SELECT 
    `ARTICLES`.`id`
    , `ARTICLES`.`content`
    , `STATIONS`.`station_name`
    , `LINES`.`line_name`
FROM 
    `ARTICLES`
INNER JOIN 
    `STATIONS` 
ON 
    `ARTICLES`.`station_id` = `STATIONS`.`id`
LEFT JOIN 
    `LINK_LINE_STATION`
ON 
    `STATIONS`.`id` = `LINK_LINE_STATION`.`staion_id`
LEFT JOIN
    `LINES`
ON 
    `LINK_LINE_STATION`.`line_id` = `LINES`.`id`
WHERE 
    `LINES`.`line_name` LIKE '%路線名%'

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/09/18 01:06 編集

    コードまでかいていただきありがとう御座います。
    ばらばらに分けるのですね〜 参考にさせていただきます!

    ところで、この場合、検索結果を表示させる場合はどのようなコードをかくのでしょうか?

    キャンセル

  • 2015/09/18 01:08

    何えお検索条件にして、どの値を取り出したいかによって変わります。

    キャンセル

0

「線」と「駅名」で1テーブル
これだと、「駅名」だけでぶら下げる記事が作りづらくなるし、
検索時も、「駅名」だけで引っ張ってきたいといった時も、対処しづらくなる。

あと、内容が「記事」であれば、作成日時(更新日時・投稿日時)が欲しい。
最新の記事がどれなのかわからなくなってしまう。

DB設計のの手順としては、
1.取り扱いたい項目を全て書き出して並べる。
「タイトル」「記事」「線」「駅名」「作成日時」

2.データを登録していくと重複する項目(またはグループ)で分ける。(第一正規化)
・「タイトル」「記事」「作成日時」
・「線」
・「駅名」

3.分けたグループごとに、データを一意に決定できる項目(以降、主キー)を選択、
なければ追加(第二正規化①)
・「タイトル」「記事」「作成日時」→「記事ID」(登録時自動採番)を追加
・「線」→「路線コード」(一意となる任意コード)を追加
・「駅名」→「駅コード」(一意となる任意コード)を追加

4.分けたグループを主キー関連付けさせる(第二正規化②)
・「記事ID」「タイトル」「記事」「作成日時」→「路線コード」「駅コード」追加
・「路線コード」「線」
・「駅コード」「駅名」

と言った感じ。多少我流が入ってるかもしれないので。
正規化については、ネットで知識を深めてください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/09/18 13:23

    回答ありがとうございます。
    どういう手順で設計していけばいいのか迷っていたので参考になります!

    キャンセル

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

  • ただいまの回答率 90.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    MySQL&PHPについて

    現在MySQLを使って会員制のサイトを作っていて パスワードの保存の際に"任意の文字&パスワード&任意の文字(同じもの)"をハッシュ化して保存したいのですが 任意の文字を同じデータ

  • 受付中

    システムやプログラムやっていて、聞いて欲しい笑える話、ありますか?

    先日、私がフルスクラッチで作成したPHP+Smarty+MySQLを用いた動的な検索システムに、「システム監査が入ります。」とクライアントさんから電話がありました。サニタイズやイン

  • 解決済

    1日に100万レコード増える場合のテーブル設計

    株価データをmysqlにinsertするシステムを組んでおります。 全銘柄の株価を1分おきに取得します。 銘柄数は3600、株式市場の時間は1日300分 3600×300=1,08

  • 解決済

    PHP、MySQLで別のDBにコピーしたい

    PHP、MySQLで別のDBに接続してテーブルの中身のデータをコピーしたいです。 コピー元: DB名→db1 テーブル名→test1 コピー先: DB名→db2 テーブル名

  • 解決済

    DBの設計に関して

    訪問予定を登録していくのに、DBの設計をどのように作るとわかりやすいものか?と思っているので、アドバイスだけでもいただければと思っています。 1.訪問予定日の選択 2.

  • 受付中

    MYSQLを使用した口コミ・商品テーブルの設計について

    前提・実現したいこと PHP+MYSQLでkakaku.comのようなユーザー登録機能+各商品の口コミ機能+各商品のまとめ記事投稿機能をつけたものを構築したいのですが、PHP+M

  • 解決済

    mysqlで数100列のテーブルを作りたい

    今、mysqlにてテーブルを185列のテーブルを作成しようとしています。 (以下のコード) mysql> create table kifus( -> id int n

  • 解決済

    異なるテーブルにあるデータを混在して呼び出したい

    お世話になります。異なるテーブルにあるデータを一つのテーブルにあるデータかのように呼び出したいと思っています。 イメージ的には以下のようなテーブルがあります。 (例ですので実際

同じタグがついた質問を見る

  • PHP

    19851questions

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

  • MySQL

    5694questions

    MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。