2017-12-30 101 views
0

나는 내 프로젝트를위한 데이터베이스를 만들고있다. 현재 이미지가있는 테이블과 제품이있는 테이블이 있습니다.ID의 배열을 쿼리하는 가장 빠른 방법은 무엇입니까?

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

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

기본 아이디어는 하나의 제품에 속한 모든 이미지의 ID를 product.images 필드에 저장하는 것입니다. 특정 이미지에 해당 제품을 찾는 것은 데이터베이스의 유스 케이스 일 것입니다. 또한 하나의 이미지는 여러 제품에 속할 수 있습니다.

이제 어떤 제품이 이미지에 속하며 데이터베이스에 수백만 개의 제품과 이미지가 저장되는 경우 결과를 얻는 가장 빠른 방법인지 확실하지 않습니다. 하나의 이미지와 관련된 모든 제품을 저장하는 곳에 image.products 필드를 추가하는 것이 더 빠릅니까?

(I 데이터베이스로 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

각 제품마다 하나의 이미지 만 있지만 각 이미지에는 여러 제품이 포함될 수있는 일대 다 관계의 경우 image_id의 외래 키를 사용하는 것이 가장 좋습니다.

제품이 여러 개의 이미지를 가질 수 있고 이미지가 둘 이상의 제품과 연관 될 수있는 경우 다 대다의 연결 테이블 만 필요합니다. 이 경우, product_idimage_id의 두 열이있는 product_images_assoc과 같은 테이블을 사용하십시오.

이 연관표를 사용하면 product_id 중 하나에 대해 모두 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