0

カテゴリと情報の2つのテーブルがあります。

カテゴリは次のようになります。

id | name 

情報は次のようになります:

id | parent_id | name | url

parent_idは、カテゴリからのIDです。

ユーザーが複数のURLを追加できるフォームがあります。より多くのURLフィールドを表示するために押すことができるボタンがあります。複数のURLがある場合は、url2、url3などがデータベースに追加されます。

情報は次のようになります。

id | parent_id | name | url | url2 | url3

これは適切なアプローチですか?

もしそうなら、情報が次のようになったらどうしますか?

id | parent_id |name  |url            |url2          |url3
1  | 1         |One   |http://cnn.com |
2  | 1         |Two   |http://msn.com |http://aol.com|

One、Two、またはw / eを表示する場合、URLを取得するためにクエリを実行するにはどうすればよいですか?

私は私ができることを知っています:

$mysqli->query("SELECT i.url FROM info AS i LEFT JOIN categories AS c ON i.parent_id = c.id");

しかし、これは私がi.url、i.url2、i.url3を配置することに依存しており、情報ごとに個別のクエリを作成する必要があります。PHPが選択するi.urlの数と内容を決定するようにしたいと思います。

したがって、次のようになります。

$mysqli->query("SELECT (PHP determines what i.url to put here depending on what info page I'm viewing) FROM info AS i LEFT JOIN categories AS c ON i.parent_id = c.id");
4

2 に答える 2

0

いいえ、ここでの正しい解決策は、おそらく「info_urls」と呼ばれる別のテーブルです。これは、info-to-urlsを使用して1対多をモデル化します。

これは「正規化された」設計であり、「情報」ごとに無制限のURLを許可し、クエリを実行するのは非常に簡単です。

SELECT name, GROUP_CONCAT(info_urls.url) as urls 
FROM info JOIN info_urls ON info.id = info_urls.info_id;

列は次のようになります。

id
info_id
url

このソリューションは、ユーザーが入力するURLの数がわからないという現実をモデル化しており、RDBMSは列ではなくCRUDに対して作成されます:-)(クエリのためにそれらを結合するのに非常に優れています)

于 2012-12-17T04:16:32.373 に答える
0

そのパスに進むと、null値を持つ列がたくさんあり、クエリで問題が発生します。これは、あなたが説明していることとほぼ同じです。

infosでマップする別のテーブル(おそらくURL)を作成しurlます。例えば:

url_id | info_id | url 

これは、ここで簡潔に説明されている繰り返し属性のデザインパターンです:http: //www.tomjewett.com/dbdesign/dbdesign.php? page = phone.php

クエリを実行する方法の例を次に示します。

SELECT i.*, url
FROM info i JOIN urls u ON i.id = u.info_id
于 2012-12-17T04:16:55.170 に答える