naver_place_id 가 중복해서 저장되는 문제가 발생함. A,B,C,D 네개 모두 같은장소인데 현재는 pkey 를 좌표+가게명 으로 잡아놔서 naver_place_id 가 같은 장소들이 양산되는것.

어떻게 해결했는가

세단계 거쳐야됨

  1. naver place id 가 없는 장소 7000개에 대한 크롤링
    • 서버에 엔드포인트 만들고 크롤링할것. 이때 place id로 크롤링 시도하면 될듯
    • google image는 긁어오지 않는다. 추후 merge 할때 dangling 이미지를 방지하기 위함
    • 크롤링은 curl_cffi + residential proxy 를 통해서 크롤링
    • 사라져서 naver_place_id 를 추적할 수 없는 가게 등은 어쩔수 없이 일단 냅둔다.
  2. 장소 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;
  1. 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 ###