2010-01-10 4 views
0

나는 반대 의견을 가지고있는 질문이 있는데, 추가 의견을 감상 할 수 있습니다.MySQL : 사용자의 "보기"를위한 테이블 구조

내 사이트에는 각각 user_id가있는 사용자가 있습니다. 이러한 사용자는 제품을 볼 수 있으며 특정 제품을 보는 고유 한 사용자 인스턴스를 추적해야합니다. |

VIEW_ID (INT, PK) :

옵션 1 : 별도의 뷰 테이블 뷰를 기록하려면, 나는 현재 두 가지 옵션이있어 user_id (INT, FK) | product_id (INT, FK) | view_date

... ON DUPLICATE KEY로 쉽게 업데이트 할 수 있도록 두 개의 중간 열에 대해 고유 제한 조건을 만듭니다. 동일한보기가 이미 있으면 view_date 만 업데이트합니다. 그렇지 않으면 새로운 행을 씁니다.

옵션 2 :

user_product (VARCHAR20, PK) | view_date

... 중간에 구분 기호가있는 VARCHAR에 두 ID를 병합하고 위와 같은 방법으로 ON DUPLICATE KEY로 쉽게 업데이트 할 수 있도록 기본 키 열을 사용하십시오.

구조는 대략 다음을 수용해야합니다. 백만 가지 고유보기 어떤 옵션이 더 좋든 나 나 낫지 만, 그 이유는 무엇입니까? 사전에 큰 감사드립니다.

편집 : 답변 해 주셔서 감사합니다. 같은 편에 기대고 있었지만 안심이 필요했습니다.

답변

2

저는 첫 번째 옵션을 더 좋아합니다. 일반적으로 가능한 한 많은 원 자성을 유지하는 것이 좋습니다. 모든 사용자의보기 또는 그와 비슷한 것을 쿼리하려는 경우 두 열을 하나로 병합 한 후 수행하기가 더 어려울 것입니다 (와일드 카드 일치와 함께 LIKE을 사용해야 할 것입니다. 인덱싱 된 단일 값 열). 또한 다른 필드에 대해 색인을 생성하는 기능이 손실됩니다. 또한

, 거기에 여러 열을 포함 기본 또는 고유 키가 couldnt는 왜 아무 이유도 없다, 그래서 난 그냥 REPLACE (documentation) 대신 INSERT의 사용, 당신의 갱신을 수행하려면 옵션 2로 어떤 이점을 볼 수 없습니다 -이됩니다 사용자/제품 조합 당 하나의 행만 갖는 불변성을 쉽게 유지할 수 있습니다.

+0

옙 ... REPLACE가 자동 증가 INT ID (삭제 후 다시 쓰기)를 "소비"하므로 PK 열 데이터 유형이이를 수용해야합니다. – Tom

1

첫 번째 옵션은 더 나은 선택이라고 생각합니다. 나중에 나는 다른 것들에 대해 좀 더 쉽게 질의 할 것이라고 생각한다. 쿼리에는 문자열 조작이 포함되지 않기 때문에 더 빠를 수도 있습니다. 또한 필요한 경우 여러 열에 대해 기본 키를 가질 수 있습니다.

1

확실히 첫 번째 옵션으로 이동하십시오. 두 번째 옵션은 특정 그룹의 사용자를 찾기 위해 보고서를 작성해야하는 경우 지옥의 많은 쿼리를 의미합니다 (제품 X 및 제품 Y를 자주 볼 수있는 모든 사용자를 할인으로 제공 할 수 있도록). 특정 그룹을 찾는 경우에도 마찬가지입니다. (동일한 제품에서 종종 볼 수있는 제품이므로 할인 프로모션을 시작할 수 있습니다.)

개인적인 견해를 모두 기억해야하는 것은 아닙니다.그러나 나는 그들이 제품을 방문한 횟수를 확실히 포착 할 것입니다. 이것은 거의 무료입니다. 누적 합계를 유지할 수 있습니다 (중복 키 업데이트에서 view_count = view_count + 1에 삽입하십시오)

+0

view_count ... 감사합니다. 지금은 필요하지 않지만 아마 좋은 조언을 추가 할 것입니다. – Tom