2010-06-02 5 views
3

여기에 SQL 전문가를위한 몇 가지 질문이 있습니다 ... 간단히 말해서 사용자가 다른 국가, 카테고리, 언어에 대한 캠페인을 정의 할 수있는 광고 관리 시스템입니다. 나는 염두에두고 몇 가지 질문을하므로 당신이 할 수있는 일을 도와주세요.복잡한 SQL 디자인, 도움/조언 필요

일반적으로 저는 ASP.NET을 사용하고 있으며 처음으로 통계를 요청하면 특정 사용자의 모든 결과 집합을 캐시하고 싶습니다. 이렇게하면 서버로의 큰 왕복을 피할 수 있습니다.

도움 당신이 내 질문에

에 필요한 모든 세부

Click here for diagram을 환영 이 응용 프로그램의

1.Main 문제가 많은 클릭이 수/노출이 얼마나 그가 지출 얼마나 많은 돈을 사용자에게 보여주는 것입니다 on 캠페인. 이 정보를 얻는 가장 쉬운 방법은 무엇입니까? 또한이 통계 표에 날짜, 날짜 범위 및 기타 몇 가지 매개 변수별로 필터링을 포함시킵니다.

2. 기타 문제는 사용자가 캠페인을 수정하려고 할 때 발생합니다. 사용자가 캠페인 PPU (단위당 지불)로 0.01 $를 설정하고 다음 날에 0.05로 업데이트하면 올드 캠페인이 사망합니다. 모두는 0.05 $로 재설정됩니다.

3. 테이블 디자인의 일부 부품을 다시 디자인하여 더 유연하고 쉽게 수정할 수 있다면 어떻게 할 수 있습니까?

감사합니다 ... 너무 큰 일 죄송하지만 여기

+2

매우 정교하게 정규화 된 데이터베이스 ... :-) – Lucero

+0

아주 잘 배치 된 데이터베이스입니다. 그러나 나는 단위당 임금의 역사가 중요하다는 것을 질문해야한다. 이전 또는 이전 캠페인에 대한 단위당 지불을 추적 할 수 있어야합니까? –

+0

@ John Hartsock, PPU는 사용자 지출의 양을 계산할 때 PPU를 사용하기 때문에 중요합니다. 따라서 사용자 편집 캠페인에서 ppu를 낮추거나 높게 설정하면 정확한 예측을 할 수 없습니다. – eugeneK

답변

2

# 1의 경우 일부 SQL들 관심을 수 있습니다, 당신은 흥미로운 통계를 보여 뷰 시리즈를 사용할 수도 있습니다. 결과를 캐시하려는 경우 n 시간마다 새로 고침되는 보고서 테이블에 결과를 저장할 수 있습니다 (어쩌면 까지까지 최대 3 번)?이 시나리오에 적합한 지 모르겠습니다.).

모든 데이터가 보고서 표에 포함되면 필터링을 위해 색인을 생성 할 수 있으며 일정에 따라 삭제되고 다시 채워지기 때문에 액세스하는 것이 더 빠릅니다.

통계표를 채우는 데 너무 오래 걸리지 않을 때만 작동한다는 점에 유의하십시오 ("너무 길다"라는 판단을해야합니다).

# 2의 경우 기본 디자인 문제로 들립니다. "편집"이란 무엇을 의미합니까? 이 편집 작업으로 이전 캠페인이 삭제되고 새로운 "복제본"캠페인이 생성됩니다 (분명히 완벽한 복제품이 아니거나 문제가되지 않을 것임). 중요하지만 편집으로 고아가되었거나 삭제 된 기록 데이터가 있습니까? 이 "편집"프로세스를 분석하고 이러한 테이블 중 일부에 기록 추적을 추가해야하는지 확인하십시오. 어쩌면 오래된 레코드에 대한 단순한 datetime 일 수도 있고 "편집"작업에 의해 수정되는 테이블의 구조를 반영하는 별도의 "history"테이블 일 수도 있습니다. # 3

, 그것은 괜찮아 보이지만, 난 단지 시스템의 은색을보고 있어요. 당신이 주변에 그들을 제거하지 고려 편집 된 캠페인을 유지하려는 경우 나는 ... 응용 프로그램의 나머지 부분은 설계 방법

+0

@FrustratedWithFormsDes, 1. 뷰는 괜찮지 만 각 조인에는이 수준의 정규화로 약 5-8 조인이 포함됩니다. 어쩌면 테이블을 비정형 화하여 5-8 개의 조인을 피할 수 있습니다. 2. 사용자가 캠페인을 편집 할 경우 어떻게해야합니까? PPU가 달라 지므로 올바른 통계를 표시 할 수 없습니다. 내가 다른 테이블을 만들면, 즉. HistoryOfCampaigns 나는 현재 캠페인에 대한 올바른 통계를 얻기 위해 사고 버전을 반복해야 할 것입니다. – eugeneK

+0

@ FrustratedWithFormsDes, 보고서 테이블을 디자인하는 방법에 대한 조언을 해 줄 수 있습니까? 나는 아직 단서가 없다. 날짜 시간, 캠페인 상태, 클릭 수, 노출 필터링 옵션이 있어야합니다. – eugeneK

+1

@eugeneK : 보고서 표에는 사용자의 통계보고에 필요한 열이 포함되어야합니다. 아마 UserID, CampaignID, CampaignName, CampaignDate, AmountSpentToDate (데이터가 생성 될 때 계산 된 열일 수 있음) ... 그런 다음 원하는 데이터로 보고서 표를 채워야합니다. * 이것을하기위한 많은 * 방법. 매시간 또는 사용자 당 온 디맨드 만 가능 ... 가장 간단한 방법은 하루에 한 번, 자정에 실행하는 것입니다 (실행하는 데 시간이 오래 걸리는 경우). 그리고 네, 보고서 테이블의 데이터가 조금 de-normalized 수도 있지만 괜찮습니다. – FrustratedWithFormsDesigner

1

유진,

을 모른다. 대신 캠페인 날짜를 민감하게 만드십시오. 예를 들어 UserA는 2010 년 1 월 1 일에 캠페인 1을 시작하여 2010 년 2 월 1 일에 종료 한 다음 2010 년 2 월 2 일에 campaign2를 시작했습니다.

또는 캠페인 데이트 끝의 개념처럼 해달라고합니다. 캠페인의 기록 표를 고려해 볼 수 있습니다.기본적으로 동일한 테이블 구조이지만 행을 고유하게 만들기 위해 UniqueIdentifier가 추가되었습니다.

또한이 캠페인 테이블의 예상 크기와 관련 테이블이 디자인에 중요하다는 점에 유의해야합니다. 하나의 테이블에 오래된 레코드와 현재 레코드를 유지하는 행 수가 1000 개 밖에되지 않을 것으로 예상되는 경우 문제가되지 않습니다. 그러나 1000000 이상을 계획하고 있다면 더 빠른 쿼리를 위해 구형을 구형과 분리하거나 필터링해야 할 필드에 통계 및 표식을 적절히 계획 할 수 있습니다. 또한 indicies는 읽기에 유익하지만 기억이 느려집니다.

+0

의 히스토리 테이블로 계산되기 때문에 잘못 될 것이다. 그것은 내가 그것을 디자인 할 때 의미가 없다는 것입니다. ppu 또는 dailyBudget의 각 변경 사항이 CampaignsHistory 테이블에 저장되었다고 가정하면 campaignName과 같은 항목은 HistoryTable에 저장할 가치가 없습니다. 이제는 일정 기간 동안 얼마나 많은 사용자가 소비했는지 알고 싶습니다. 현재 캠페인에 해당하는 모든 행을 HistoryTable에 반복적으로 생각하고 해당 보고서를 사용자에게 생성해야합니다. TBH이면 CPU 과부하가됩니다. 또 다른 방법은 내가 문제를 해결하기 위해 생각보다 많거나 적은 HistoryTable로 변경됩니다 parentCampaignID을 설정하는 것입니다 – eugeneK

+0

이런 식으로 물건을 관리하는 경우 .. 기본 키에 대한 GUID/UniqueIdentifier를 사용하십시오. 이 방법으로 히스토리 테이블의 레코드 ID는 여전히 세부 테이블에 대한 참조를 갖습니다. 참고 GUID PK에 클러스터 된 기본 키를 사용하지 마십시오. GUID가 순차적이지 않다면 효율성이 떨어집니다. –

+0

GUID가 둘 다 연결되면 보고서를 작성할 수 있도록 어떻게 내역을 기록 테이블과 현재 테이블에서 얻으려고합니까? – eugeneK