3

의 내가이 테이블/모델을 가지고 있다고 가정 해 봅시다 :사용자의 위시리스트에있는 제품의 가격 하락을 추적하는 방법?

Product 
- id 
- last_updated_date 
- name 
- price 

User 
- id 
- name 

WishlistItem 
- id 
- user_id 
- product_id 

제품 테이블은 몇 백만 레코드가와 (예전를 삭제, 새 테이블에 삽입) 데이터 가져 오기를 통해 매일 밤마다 자동으로 업데이트되고있다. 기본적으로 해당 테이블/모델에 대한 읽기 전용 액세스 권한이 있습니다.

제품이 사용자 위시리스트에 있고 가격이 떨어지는 경우 해당 사용자에게 알릴 수 있기를 바랍니다. 이를 위해 어떤 방법을 사용할 수 있습니까?

나는 몇 가지 아이디어가 다음 Product.last_updated_date의

  1. 보관할 트랙 위시리스트 모델을하고 주기적으로 업데이트되어 있는지 확인하기 위해 제품 테이블을 폴링. 이것은 끔찍한/확장 불가능한 솔루션처럼 들립니다.

  2. Product 테이블이 업데이트 될 때 트리거되는 Postgres보기 또는 기능의 일종입니까? 나는 포스트 그레스에 익숙하지 않기 때문에 이것이 가능한지 확실하지 않다.

  3. 당신은 내가 :)

생각하지 않은 올바른 방향으로 어떤 도움을 주시면 더 좋구요하도록 제안합니다 것을 놀라운 것!


업데이트 : 위시리스트에 항목 자체 내부의 현재 가격을 캐싱하고 와서 하나의 아이디어, 즉 :

WishlistItem 
- id 
- user_id 
- product_id 
- price 

... 다음, 가져 오기 후, 나는 비교할 수 WishlistItem.price Product.price로 변경하고 그에 따라 알립니다. 그것은 작동하지만 모든 사용자에 대한 모든 WishlistItem은 본질적으로 가격 데이터의 동일한 캐시 된 복사본을 가지므로 업데이트가있는 경우 모든 목록을 새 가격으로 업데이트해야하기 때문에이 접근 방식은 다소 낭비가되는 것 같습니다. 그래도 주위에 방법이 있는지 모르겠습니다.


UPDATE : 나는 업데이트를 트리거 표준 사용할 수 있도록 내가 아마 데이터의 모든 버전을 추적해야했다 결국 . 또한 가격 변동 추이를 추적 할 수 있도록 모든 가격 변경 기록을 남길 수 있습니다.

+0

귀하의 업데이 트가 아래 나의 제안에 따라 가격이 비정규 화되었습니다. 당신이 당신의 제품 표를 대체하기 때문에 당신은 다른 테이블에 당신의 가격을 기록해야합니다. 알림은 사용자가 말한 것처럼 위시리스트 테이블을 업데이트하거나, 알림 테이블을 가지고 있으며 사용자/제품별로 하나의 알림 만 허용하는 등의 다른 해결책이 있습니다 (단순히 위시리스트의 ID를 추가하고 고유하게 만들기 만하면됩니다) . – Teson

답변

2

을 통지 테이블을 생성하지만 Product 테이블이 실제로 존재하지 않는 것 같은데 업데이트, 교체 중입니다. 이 경우 트리거를 트리거하는 업데이트가 없으므로 Wishlist (사용자 247245 노트)의 가격을 캐싱하고 가격 변경을 위해 Product을 스캔하여 어려움을 겪어야합니다.

Products이 도매로 교체되는 것이 아니라 업데이트되는 경우 가격이 변경 될 때를 메모하고 이해 관계자에게 알리도록 준비하는 데 업데이트 트리거를 사용할 수 있습니다.트리거는 아마도 Products 업데이트를 잠그는 것을 피하기 위해 별도의 테이블에 알림을 삽입하여 알림을 대기열에 추가합니다 (예 : Product_price_changes). 그런 다음 Products 업데이트가 완료되면 별도의 작업으로 Product_price_changesWishlist과 비교하고 관심있는 사용자에게 알리고 Product_price_changes의 모든 항목을 삭제하면됩니다.

최신 버전의 PostgreSQL에서는 모든 행 변경시 발동하기보다는 열이 변경 될 때만 업데이트 트리거를 제한 할 수 있습니다.

+0

테이블이 도매로 교체되지 않으면 업데이트 트리거가 올바른 방법이 될 것 같지만 그렇습니다. 불행히도'Products' 테이블은 거대하며 데이터를 가져 오는 데는 정말로 오랜 시간이 걸립니다. 테이블을 교체하면 (UPSERT 행이 아닌) 크게 속도가 빨라지지만 업데이트 트리거를 사용할 수있는 능력이 없어집니다. 더 중요한 것이 무엇인지 평가해야 할 것 같습니다 : 전체 가져 오기 속도 또는 업데이트 트리거 기능. import가 끝난 후에'product_price_changes'를 생성하는 루비 옵저버와 같은 기능을 모방 할 수 있습니다. – markquezada

+0

'제품'의 값은 실제로 얼마나 자주 변경됩니까? 일일 제품 데이터 덤프가 외부 소스에서 제공되는 경우 diff/패치 계약 (텍스트 파일의 경우 단순한 diff (1) 일 수도 있음) 시스템을 수정하여 작은 변경 사항까지 정리할 수 있습니다. 그런 다음 변경 사항을'Product' 테이블에 적용하십시오. 트릭은 작업로드를 줄이거 나 작은 덩어리로 퍼지기 때문에 '제품'을 잠그고 온라인 시스템으로 들어가는 것을 방지합니다. 다행히도 "큰 데이터베이스"대원은 내일 새로운 아이디어로 나타날 것입니다. –

+0

글쎄, 그들은 자주 변경하지 않을 수도 있지만, 문제는 내가 사용하고있는 레코드 및 데이터의 엄청난 양입니다. 그것은 수백만 레코드입니다. 따라서 작은 비율로 업데이트해도 여전히 상당히 큽니다. 많은 데이터. (나는 다른 테이블도 가져오고 있는데 이것은 다소 큰 데이터 세트에서 하나의 조각 일뿐입니다.) 당신은 맞습니다. 수입시 테이블 전체를 재고 할 필요가 있습니다 ... – markquezada

2

위시리스트 테이블에 "price"필드를 추가합니다. 낮은 가격의 제품 테이블 쿼리의 업데이트 후 사용하면 Product에 업데이트 트리거를 사용할 수있는 결과로

관련, /t

+0

좋은 조언. 시도해 볼게. – markquezada

관련 문제