1

ONE table JOINを使用して、顧客が検索できる車両のMAKE、MODEL、YEAR、およびTRIMS基準のリストを取得する方法を理解しようとしています。

すでにマスターキーテーブルがあり、管理者はそこからさまざまな車両オプションから選択し、その製品に関するこれらの車両関連の詳細をPRODUCTテーブルに入力します。

管理者がPRODUCTSテーブルに入力した内容に基づいて、利用可能な車両の詳細の選択肢のみを反映した、買い物客用のリストを作成したいと思います。

PHPを使用してMAKEMODELTRIMSテーブルをループ/反復し、PRODUCTSテーブルでPRODUCTSテーブルにMAKE MODELYEARTRIMタイプが存在するかどうかを検索しています。ただし、PRODUCTSテーブルへの個別の呼び出しは約800回かかります。

これはベストプラクティスではなく、あらゆる種類の問題を引き起こす可能性があることを理解しています。データベースへの多くの呼び出しへの道であり、効率的ではありません。

私は別の質問で言われています

https://stackoverflow.com/questions/13960571/sanity-check-mysql-whats-reasonable-800-calls-to-the-database-in-one-second

これは、 JOINステートメントとWHEREステートメントを使用して1回の呼び出しで実行できます。

以前にテーブルJOINSを使用しましたが、これらの多くのMAKES、MODELS、YEARS、TRIMSを1回呼び出すだけで、買い物客が選択できるMAKES、MODELS、YEARS、TRIMS基準の1つのリストを作成する方法がわかりません。

私はあなたの例からここでこれについて学ぶことができるものは何でもありがたいです:)

車両関連の詳細を製品エントリレコードに追加するための管理マスターキー選択テーブルの例を次に示します。


表:MAKES

| Id | MAKE      | // Admin table for selecting products related vehicle make 
------------------
| 1  | FORD      |
| 2  | CHEV      |
| 3  | GMC       |
| 4  | HONDA     |
etc.

テーブル:フォード

| Id | MODEL     | // Admin table for selecting products related vehicle model 
------------------
| 1  | F150      |
| 2  | ESCAPE    |
| 2  | EXPLORER  |
etc.

テーブル:FORD_F150_YEARS_TRIMS

| Id | YEARS|                  TRIMS                      |  // Admin table for selecting products related vehicle year and trim(s)
--------------------------------------------
| 1  | 1999 | 1999_SPORT+1999_SPORTRAC+1999_XLT+1999_XLS  |
| 2  | 2000 | 2000_XLT+2000_XLS+2000_LTD+2000_EDDIE_BAUER |
| 3  | 2001 | 2001_SPORTRAC+2001_XLT+2001_LTD             |
etc.

管理者が製品/車両の詳細を入力している製品テーブルは次のとおりです。

表:製品

| PRODUCT_ID  | MAKE          |          MODELS         |      YEARS       |                                     TRIMS                                               |
----------------------------------------------------------------------------------------------------------------------------------------------------------------------
| 123456      | FORD FORD GMC |   F150 ESCAPE CANYON    |  2000 2001 1999  | FORD_F150_1999_SPORT+FORD_F150_1999_SPORTRAC+GMC_CANYON_1999_LTD+GMC_CANYON_1999_LTD    |
| 123457      | FORD GMC CHEV | F150 EXPLORER SILVERADO |  2000 2010 2010  | FORD_F150_2001_XLT+FORD_F150_2001_LTD+GMC_CANYON_2010_XLT+CHEV_SILVERADO_1500_2010_LTD  |
etc.

私がやりたいのは、PRODUCTSテーブルでクエリを実行して、製品がある車種のみのテーブルまたはリストを作成できるようにすることです。

したがって、SPORTRACトリムを備えた2001 FORD F150に適合する製品がPRODUCTSテーブルにない場合、買い物客に2001 FORD F150を備えたSPORTRACの選択肢を提供したくありませんが、XLT + LTDを搭載した2001年フォードF150

だから本当に-私は、存在しない製品の車両の詳細について買い物客の選択肢を排除したいだけです。

これは、データベースへの1回のMySQL呼び出しで実行できると言われています。すべてのメーカー、モデルトリムをループしてPRODUCTSテーブルを個別に呼び出す代わりに、テーブル結合とwhileステートメントを使用して、顧客ベースで利用可能なすべての潜在的なMAKEMODELTRIMSの選択肢のリストを取得できると言われています。 PRODUCTSテーブルにあるもののみ

PRODUCTSテーブルを1回呼び出してから、PHPを使用して結果の重複をループして削除することで、これを行う方法がわかります。しかし、何千もの製品があり、これらは成長する可能性があります-それで私はこれを達成するためのベストプラクティスの方法を探しています。

4

1 に答える 1

0

まず第一の問題は、これらの異なるテーブルを持っているが、それらをリレーショナルに使用していないことです。テーブルを適切に正規化する方法については、時間をかけて学習する必要があります。一般的なガイドラインとして、実際のアイテム/プロパティが互いにどのように関連しているかをよく考え、適切な主キーと外部キーの使用を通じてその関係を表現する必要があります。

製品は、製品テーブルのデータを複製するのではなく、さまざまな主キー ID を介してメーカー、モデル、トリムなどに関連付ける必要があります。たとえば、「Ford」テーブルではなく、「models」のテーブルだけを使用する必要があります。

サンプルとして、このようなスキーマがあるかもしれません

models
---------
model_id
make_id
model

makes (Make is really just a property of the model of car, and could possibly be de-normalized into models table. Here I am showing it as separate table to show a fully normalized example.)
---------
make_id
make

trims ('SPORT+XLS' unless those represent a specific trim combination.  Each different trim package should have its own row)
--------
trim_id
trim

products (I am assuming that a model and year define a product, by looking at your example data)
--------
product_id
year
model_id


product_trims (many-to-many table expressing relation of products to trims - you could have multiple rows with same product_id and different trim id)
-------------
product_id
trim_id

年式、モデル、およびトリムの組み合わせとして定義された製品が本当に必要な場合は、product_trims テーブルを削除して、このように改訂された製品テーブルを作成できます。

product
-------------
product_id
year
model_id
trim_id

次に、結合全体でクエリを実行して、必要なデータを取得できます。たとえば、ユーザーがモデルと年を指定したとします。クエリは次のようになります (products テーブルと products_trim テーブルの両方を使用することを前提として示されています)。

SELECT p.product_id, p.year, ma.make, mo.model, t.trim
FROM
products AS p
INNER JOIN models AS mo ON p.model_id = mo.model_id
INNER JOIN makes AS ma ON mo.make_id = ma.make_id
INNER JOIN product_trims AS pt ON p.product_id = pt.product_id
INNER JOIN trims AS t ON pt.trim_id = t.trim_id
WHERE p.year = '?' AND p.model_id = ?

もちろん、結合や WHERE または ORDER BY 条件に使用されるすべてのフィールドを適切にインデックス化する必要があります。

于 2012-12-20T00:48:51.737 に答える