2017-12-30 61 views
0

私は私のプロジェクトのデータベースを構築しています。現在、私はイメージを持つテーブルと製品を備えたテーブルを持っています。IDの配列をクエリする最も速い方法は何ですか?

product 
Column   | Type | 
----------------+-----------+ 
id    | integer | 
images   | integer[] | 
display_image | integer | 
... 

image 
Column   | Type | 
----------------+-----------+ 
id    | integer | 
data   | text  | 

基本的な考え方は、1つの製品に属するすべての画像のIDをproduct.imagesフィールドに格納することです。特定のイメージに対応する製品を見つけるためのデータベースの使用例です。さらに、1つのイメージは複数の製品に属することができます。

どの製品がイメージに属しているかを照会し、データベースが何百万もの製品と画像を保持する場合、これが最も速い結果を得る方法であるかどうかはわかりません。 1つのイメージに関連付けられているすべての製品を保存する場所にimage.productsというフィールドを追加する方が速いでしょうか?

(私はデータベースとしてPostgreSQLのを使用しています)現在、次のようになり、特定の画像のための製品を取得するクエリ:

SELECT * from product where image.id = ANY(product.images) 

の負担になり維持する必要がある別のフィールドを持ちますAPI側。このリファクタリングを行う前に、上記のクエリで後でパフォーマンスに影響を及ぼす可能性がある場合は、経験豊富な意見を聞きたいと思います。

返信いただきありがとうございます。

+0

ああ、古い「区切られた列」の質問。 SQLは、それが実行されている基本的な哲学/数学(データベース - SQLの実装 - これが役に立つと思われるタイプを提供するのに便利なことがあることが時々あります)に反するため、これを処理しないように明示されています。あなたが自分のテーブルにイメージキーを引き出すと、データベースは最も速くなります。 [この質問も参照](https://stackoverflow.com/q/3653462/812837)。 [このページの下部にあるヒント](https://www.postgresql.org/docs/current/static/arrays.html)を見てください。 –

答えて

0

このような一対多の関係(各製品には1つのイメージしかありませんが、各イメージに複数の製品が含まれています)の場合は、image_idの外部キーを使用するのが最良です。

多対多の関連付けテーブルが本当に必要です。これは、製品に複数のイメージがあり、イメージが複数の製品に関連付けられている可能性があります。このような場合はproduct_idimage_idという2つの列を持つproduct_images_assocというテーブルを使用します。

この関連テーブルでは、product_idのいずれか1つにすべてimage_idを取得しやすく、その逆もあります。

希望すると便利です。

+0

申し訳ありませんが、私は正しく説明していないことがあったと思います。製品には複数の画像を保持できます。例えば、product.Aは画像[1、2、3]を有し、product.Bは画像[2,3,4]を保持する。 – Ogofo

+0

その場合、 'product_id'を' image_id'にリンクするアソシエーションテーブルを作成する必要があります。次に、サブクエリ内のイメージ/プロダクトに関連付けられたIDを照会し、それをメインの 'SELECT'で使用します。私はより良い例を提供したいと思いますが、私はモバイルです。 – ztaylor54

+0

アソシエーションテーブルでは、両方の 'id'カラムがそれぞれのテーブルの外部キーでなければならないことにも言及しておきます。 – ztaylor54

関連する問題