2017-12-17 5 views
0

저는 각 사용자가 인벤토리를 가지고있는 프로젝트에서 작업하고 있습니다. 인벤토리는 실제로 프로젝트의 실제 사물에 해당하는 배열입니다.반복 요소가있는 배열 저장

인벤토리를 저장하려면 Postgres를 사용하고 데이터를 문자열 형식으로 serialize/deserialize하고 싶습니다. 그러나이 배열에서는 단일 ID가 많을 것입니다. ID는 모두 정수이므로 쉼표로 결합하고 검색하는 동안 ID를 분리하려고합니다.

예를 들어 인벤토리는 [1, 2, 3, 3, 3, 4] 일 수 있지만 긴 반복 목록이있는 1,2,3,3,3,4과 같이 저장하지 않는 것이 가장 좋습니다.

중복 된 항목을 효과적으로 저장하는 방법이 있습니까?

+0

데이터를 String 형식으로 저장하는 경우 최신 Postgres DB에서 지원하는 JSON으로 변환하지 않으시겠습니까? – Nishant

+0

오, 그 존재를 몰랐습니다. 글쎄, 비록 내가 JSON 배열로 저장한다면, 나는 여전히 그것을 압축하는 방법을 원할 것이다. 나는 해결책을 가지고 있다고 생각하고 답변으로 게시 할 것입니다. – Punknoodles

+2

PostgreSQL은 또한 배열 열을 지원하므로'int []'열을 사용할 수 있습니다. 또는 별도의 테이블을 사용하여 데이터베이스에서 적절한 참조 무결성을 유지할 수 있습니다. 또한 이러한 배열이 얼마나 많은지, 이러한 중복이 몇 개나있어 이런 종류의 최적화가 필요하다고 생각하십니까? –

답변

1

"프로젝트의 실제 사항"은 데이터베이스의 다른 테이블이어야합니다. - 같은 수량, 가격, 날짜로 등등 추가 때

create table userItems as (
    userItemId serial primary key, 
    userId int references users(userId), 
    itemId int references items(itemId) 
); 

그런 다음 추가 정보를 추가 할 수 있습니다 올바른 관계 방법은 접합 테이블을하는 것입니다.

배열이 더 적합한 경우가 있습니다. 그러나 사용자 및 항목이있는 일반적인 상황의 경우 접합부 테이블이 첫 번째 방법이며 문제를 해결할 가능성이 큽니다.

+0

이 문제는 "프로젝트의 실제 사항"이 데이터베이스에 없다는 것입니다. ID를 응용 프로그램의 의미있는 데이터로 변환하는 일부 기능이 있으므로 데이터베이스에 항목을 저장하는 것이 의미가 없습니다. – Punknoodles

0

Nishant 덕분에 배열을 JSON 형식으로 저장할 수 있음을 알았습니다.

{ 
    "1": 1, 
    "2": 1, 
    "3": 3, 
    "4": 1 
} 

나 그냥 JSON의 각 요소의 수를 저장할 수 있습니다 : 이와 함께이 같은 압축 (원래의 입력을 사용하여) 할 수 있습니다.

편집 : 코드는 다음과 같습니다.