source

응용 프로그램 메모리의 테이블을 쿼리에 매핑하는 방법

ittop 2023. 8. 30. 22:07
반응형

응용 프로그램 메모리의 테이블을 쿼리에 매핑하는 방법

이 문제는 저를 귀찮게 하고 구글이나 다른 곳에서 찾을 수 없습니다.

저는 이 문제에 MySQL/MariaSQL을 사용하고 있습니다.

제 문제는 관련 제품/카테고리가 아니라 유추를 사용하겠습니다.

레코드(제품) 목록과 각 레코드에 대한 많은 정보(열)(예: 각 제품에 대해 현재 창고에 보관되어 있는 단위 수 포함)가 있다고 가정합니다.레코드도 분류한다고 가정합니다.

SUM과 GROUP을 함께 사용하는 간단한 내부 조인은 범주별로 창고의 단위를 제공합니다.

CREATE TABLE product  ( product_id BIGINT , units_in_warehouse BIGINT );
CREATE TABLE category ( category_id BIGINT , product_id BIGINT );

INSERT INTO product  VALUES (1,5),(2,1),(3,8),(4,9),(5,10),(6,2),(7,9),(8,12),(9,3);
INSERT INTO category VALUES (1,8),(1,7),(1,7),(2,6),(2,2),(2,6),(2,5),(2,4),(2,5),(3,9),(3,3),(3,1),(4,4),(4,2),(4,8),(5,2),(5,1),(5,3),(5,9),(5,8),(5,1);

SELECT category_id, SUM( units_in_warehouse ) AS category_units_in_warehouse
FROM product 
INNER JOIN category 
ON product.product_id = category.product_id 
GROUP BY category_id;

DROP TABLE product;
DROP TABLE category;

문제는 범주 테이블이 응용프로그램만 알고 있는 기준에 따라 각 응용프로그램 처리 시간이 완전히 다른 경우(예:DB는 실행 가능한 분류 목록을 재구성하기 위해 테이블/필드를 저장하지 않습니다.기본적으로 범주 테이블은 응용프로그램 측에 저장되며, 응용프로그램 컨텍스트로 인해 DB에 저장할 수 없습니까?

  1. 임시 테이블이 필요합니다.하지만 제 문제는 제품과 카테고리 수량이 상당히 많고(+-10K 레코드), 그룹별로 사용할 임시 테이블이 10개 정도 필요합니다.임시 테이블 10개를 만들고, 10K-large Insert 절을 실행하고, 각 애플리케이션 요청에 대해 반복하는 것은 현명한 해결책이라고 생각하지 않습니다.

  2. 목록이 GROUP 절에서 재사용되지만 IN()과 마찬가지로 테이블을 쿼리에서 정적으로 정의된 목록으로 정의하고 싶습니다(따라서 IN()).

예:

SELECT category_id, SUM( units_in_warehouse ) AS category_units_in_warehouse
FROM product 
INNER JOIN (
 /* Badly written SQL here */
 SELECT category_id , product_id 
 VALUES (1,8),(1,7),(1,7),(2,6),(2,2),(2,6),(2,5),(2,4),(2,5),(3,9),(3,3),(3,1),(4,4),(4,2),(4,8),(5,2),(5,1),(5,3),(5,9),(5,8),(5,1)
 /* /Badly written SQL here */
) category 
ON product.product_id = category.product_id 
GROUP BY category_id;

...하지만 SQL 구문/단어/방법을 사용할 수 있는 방법이 없습니다.

제안할 사람?쿼리를 위해 애플리케이션 메모리의 테이블을 DB에 효율적으로 매핑하는 방법은 무엇입니까?

그러나 가장 효율적인 방법인지는 잘 모르겠지만 다음과 같은 방법을 시도해 보십시오.

SELECT category_id, SUM( units_in_warehouse ) AS category_units_in_warehouse
FROM product 
INNER JOIN (
 SELECT 1 as category_id , 8 as product_id 
 UNION ALL
 SELECT 1,7
 UNION ALL
 SELECT 1,7
 UNION ALL
 SELECT 2,6
) category 
ON product.product_id = category.product_id 
GROUP BY category_id;

product:category가 many:many인 경우 many:many 매핑을 표시할 세 번째 테이블이 필요합니다.명확성을 위해, 다음과 같은 것으로 불러야 합니다.product_category(단순히가 아님)category).

그러면 다음과 같은 작업이 필요할 수 있습니다.JOIN제품 및 제품 범주에 대한 정보를 표시하는 세 개의 표 모두.

매핑 테이블에 대한 효율성 고려사항은 다음과 같습니다. http://mysql.rjweb.org/doc.php/index_cookbook_mysql#many_to_many_mapping_table

언급URL : https://stackoverflow.com/questions/49489541/how-to-map-a-table-in-application-memory-to-queries

반응형