naver_place_id 가 중복해서 저장되는 문제가 발생함. A,B,C,D 네개 모두 같은장소인데 현재는 pkey 를 좌표+가게명 으로 잡아놔서 naver_place_id 가 같은 장소들이 양산되는것.
어떻게 해결했는가
세단계 거쳐야됨
- naver place id 가 없는 장소 7000개에 대한 크롤링
- 서버에 엔드포인트 만들고 크롤링할것. 이때 place id로 크롤링 시도하면 될듯
- google image는 긁어오지 않는다. 추후 merge 할때 dangling 이미지를 방지하기 위함
- 크롤링은 curl_cffi + residential proxy 를 통해서 크롤링
- 사라져서 naver_place_id 를 추적할 수 없는 가게 등은 어쩔수 없이 일단 냅둔다.
- 장소 merge
- sql query로 수행
- 한 장소에 대해 여러개의 row 가 존재한다면 가장 최근에 생성된 순
- 가장 최근에 생성됐다는건 자영업자가 가장 최신으로 업데이트했다는 뜻. 서버는 시계열로 발전했으므로 위 이론은 타당함
- 여기서 말하는 merge 는 postplacelink의 merge를 뜻함. 그 외에 모든 데이터는 가장 최신의 장소 데이터를 따름
- 중복된 장소의 이미지는 손수 삭제
-- 이미지 삭제하기
-- 이미지가 중복해서 존재하는 장소들 확인
SELECT *
FROM place
WHERE naver_place_id IN (
SELECT naver_place_id
FROM place
WHERE google_place_id IS NOT NULL
GROUP BY naver_place_id
HAVING COUNT(*) > 1
)
AND google_place_id IS NOT NULL
order by naver_place_id, created_at desc;
--이후 s3에서 손수 한땀한땀 지워준다. 몇개 안돼서 그냥 손으로 지웠음-- 장소를 머지하는 SQL
BEGIN;
-- 최신 place 추출
CREATE TEMP TABLE latest_place AS
SELECT DISTINCT ON (naver_place_id) *
FROM place
WHERE naver_place_id IS NOT NULL
ORDER BY naver_place_id, created_at DESC;
-- 중복 place 추출
CREATE TEMP TABLE duplicate_places AS
SELECT p.*
FROM place p
JOIN latest_place lp ON p.naver_place_id = lp.naver_place_id
WHERE p.id <> lp.id;
-- 링크 이동
UPDATE postplacelink ppl
SET place_id = lp.id
FROM duplicate_places dp
JOIN latest_place lp ON dp.naver_place_id = lp.naver_place_id
WHERE ppl.place_id = dp.id;
-- 중복 place 삭제
DELETE FROM place
WHERE id IN (SELECT id FROM duplicate_places);
COMMIT;- place의 pkey를 id로 변경.
- alembic으로 수행
- 이는 이후 해외 서비스 하게 되었을 때를 대비. pkey는 그냥 id 로 변경하고, naver 검색을 수행했을 시에는 naver_place_id로 검색하도록 변경
- naver_place_id 에 unique constraint 걸기
def upgrade() -> None:
# ### commands auto generated by Alembic - please adjust! ###
op.drop_index("ix_place_naver_place_id", table_name="place")
op.drop_constraint("place_pkey", "place", type_="primary")
op.create_unique_constraint(
"place_location_place_name_key", "place", ["location", "place_name"]
)
op.create_unique_constraint("place_naver_place_id_key", "place", ["naver_place_id"])
op.create_primary_key("place_pkey", "place", ["id"])
# ### end Alembic commands ###
def downgrade() -> None:
# ### commands auto generated by Alembic - please adjust! ###
op.drop_constraint("place_location_place_name_key", "place", type_="unique")
op.drop_constraint("place_naver_place_id_key", "place", type_="unique")
op.drop_constraint("place_pkey", "place", type_="primary")
op.create_index(
"ix_place_naver_place_id", "place", ["naver_place_id"], unique=False
)
op.create_primary_key("place_pkey", "place", ["location", "place_name"])
# ### end Alembic commands ###
