나는 가능한 한 효율적으로 구축하려는 온라인 추첨식에서 사기 탐지와 관련하여 비정상적인 클라이언트 요청을 받았습니다. 가능한 많은 작업을 SQL로 밀어 넣습니다. 100 개 거래 내에서 순차적으로 5 개 이상의 일련 번호가 나타나는 트랜잭션 파일에서 이벤트 찾기
구조
따라서이다 :table: codes raffle_code | ticket_type | sequence A00000001 Red 1 A00000002 Red 2 ... A0000000X Red X B00000001 Blue 1 etc
X ticket_types가있을 수 있습니다, 그것은 자신의 순서와 각. 래플 코드는 고유 한 해시입니다. 예제를 위해 단순화했습니다.
이제는 이러한 코드가 임의로 발급되고 연속적으로 입력되는 이벤트는 (아마도) 사기성이있는 것이 문제입니다. 코드의 enteries은과 같이 트랜잭션 파일에 기록된다
table: transactions user_id | raffle_code | transaction_number | timestamp 1 A00000032 1 etc...
원하는 규칙은 그 특정 형태의 5 개 이상의 추첨 번호는 100 트랜잭션 주어진 세트 내에서 순차적으로 입력되는 경우 용의자이며 관련된 사용자가 당겨 져야합니다.
처음에는 사기 사건을 감지하고 각 사기 사건에 대한 사기성 사용자 트랜잭션을 별도로 스쿠 핑하려고했습니다. 내가 생각하고 있었는데 거친 SQL이었다 같은 : 이것은 트랜잭션 파일에 장소 (transaction_number 범위와 타임 스탬프 범위)를 줄 것이다
(아이디어를 촉발하기위한 this question에 이상 벨 덕분에)
SELECT c.raffle_code, MIN(t.timestamp), MAX(t.timestamp), MIN(t.transaction_number), MAX(t.transaction_number) FROM codes c, transactions t WHERE c.raffle_code = t.raffle_code GROUP BY c.raffle_code HAVING (MAX(c.sequence) - MIN(c.sequence)) = (COUNT(*) -1) AND (MAX(t.transaction_number) - MIN(t.transaction_number)) 4;
사용자 ID를 다시 쿼리 할 수 있습니다. 용의자 사건에 대한 사기 진입을 사기로 선언해야하지만, 현재로서는 시스템의 승인 된 경고입니다.
위의 SQL 문제는 주어진 "10000 트랜잭션에서"3,4,5,6,7,48 "시퀀스의"red "티켓이 발견되면 범위가 45이므로 검색되지 않습니다. 티켓 수가 무작위로 입력되는 경우 예상되는 발생이 될 수 있습니다.
트랜잭션 파일의 크기가 매우 크며 자주 조회가 이루어 지므로 서버 코드를 사용하여 분석하고 트랜잭션 스택을 빌드하여 한 번에 100 개의 트랜잭션을 준설하면 매우 비효율적입니다.
누구나 전에 이와 같은 것이 발견 되었습니까? 고객은 매우 짧은 텍스트 요약 외에도 요구 사항이 매우 모호했습니다. 따라서 순차 입력을 감지하는 대체 개념을 접하게됩니다.
"상당히 큰"크기는 어느 정도입니까? 특정 티켓 유형의 행 수는 몇 개입니까? – Craig
처음에는 수십만 개를 추측하고 있지만 응답에 따라 확장 될 수 있습니다. –