2010-11-19 1 views
1

유료 사용자와 시험 사용자를 대상으로 데이터베이스를 설계해야한다면 동일한 테이블에 입력하고 필드로 구분할 수 있습니까? 아니면 두 개의 테이블에 넣을까요?동일한 테이블에서 데이터베이스 유료 사용자 및 평가판 사용자

은 또는 당신은 두 세계의 최고를 할 것 같은 테이블에 넣어하지만, 1) PaidUsers 두 개의 뷰를 생성하고 2) TrialUsers

감사합니다!

+0

네, 그렇습니다. 그 질문은 뭐니? – Karl

+0

데이타베이스 디자인에는 3 가지 다른 옵션이 있습니다 1) 동일한 테이블에 유료 및 평가판이 있습니다 2) 다른 테이블에 유료 및 평가판이 있습니다. 3) 유료 및 평가판이 동일한보기의 테이블에서 분리 된보기로 분리됩니다. – Steve

+0

실종 된 매우 중요한 점 중 하나는 뷰가 데이터베이스 디자인과 관련이 없다는 것입니다. 뷰를 쿼리 할 때마다 뷰를 정의하는 sql도 실행되기 때문에 뷰를 정의하는 것은 _only_ 유용한 기능입니다. 앱에서 쿼리를 많이 사용하면 유용합니다. 그러나 당신이 당신의 DB를 디자인하기 시작한 이래로, 어느 쿼리가 빈번할지 모릅니다. 다시 말하면, db 디자인의 초기에 뷰를 만들 계획은별로 의미가 없습니다. – vonPetrushev

답변

0

아마 몇 가지 추가 데이터에 관련이있을 수 있지만, 여전히 비 지불과 같은 필드 셋을 것이다,이 작업을 수행하는 올바른 방법은 [is-a] 방법입니다 :

사용자
ID
이름
비밀번호
전체 이름
...

Paiduse R
USER_ID는 [fk->User::id]
은 ACCOUNT_ID
....
[다른 addidional 데이터]

편집 : 자, 재판 사용자는 Paiduser에 항목이없는 User의 모든 기록 될 것입니다 . 나는 Paiduser fieldset이 trial/normal user [User] 필드 집합의 상위 집합이라고 가정합니다.

편집 2 : UserPaiduser 사이의 '설정 차이'입니다 시험 사용자의 목록을 얻으려면, 다음과 같은 SQL 작업을해야합니다 :

select u.* 
from (User as u 
     join Paiduser as p on u.id<>p.user_id) 
+0

그러면 TrialUser라는 테이블도 있다고 가정합니다. 그래서 옵션 # 2를 생각해보십시오. – Steve

+0

위의 수정 사항을 참조하십시오. – vonPetrushev

+0

나는이 디자인을 고려하려고 노력하고있다. 그러나 새로운 것이기 때문에 시험 사용자를 얻는 일반적인 SQL 호출은 무엇인가? SELECT * FROM User와 같은 것, PaidUser WHERE User.ID <> PaidUser.user_id; – Steve

0

최상의 솔루션은 데이터베이스 유형에 따라 다를 수 있습니다. 내 경험은 MySQL과 SQL Server에 있습니다. 필자는 항상 모든 사용자를 하나의 테이블에 넣었습니다. 그런 다음 필드를 사용하여 필요에 따라 차별화하십시오. 이것은 유료/무보험 또는 다른 어떤 것에도 적용될 수 있습니다. 이 솔루션은 3NF 표준을 충족하고 유지 보수 등을 위해 내게 더 쉽게 보인다. 다중 테이블을 사용하는 데는 어떤 이유가 있을까요? 유료 사용자 이후

+0

다른 테이블로 나누는 이유는 유료 사용자가 SQL에서 "유료"필드를 확인하지 않고 시험 사용자와 혼동하지 않기 위해서입니다. – Steve

+0

유료 사용자와 관련된 추가 정보가 없다고 가정하면 거의 틀림없이 계정 번호가 가장 확실합니다. –

+1

-1 : db 디자인에는 관계형 데이터베이스를 선택하는 데 아무런 문제가 없습니다 ** : mysql, mssql, postgresql, sqlite - 중요하지 않습니다. – vonPetrushev

1

난 그냥 다음과 같은 의견에 약간의 성능 고려 사항을 표현 .

단일 사용자 쿼리 (예 : 로그인 확인 또는 단일 사용자 용 데이터 검색)에서는이 두 가지 전략간에 큰 차이가 없습니다.

하지만 통계 데이터가 필요한 경우 (예 : 유료 사용자 용 및 시험 사용자 용)입니다. 두 테이블을 분리하면 좋은 생각 일 수 있습니다.

유료 사용자 또는 평가판 사용자가 어떤 통계 데이터가 필요한 경우 단일 테이블을 사용하는 것이 좋습니다.


두 시나리오가 모두 필요한 경우 어떻게해야합니까? 글쎄, 나는 두 가지 종류의 사용자간에 공통된 속성이 존재한다고 생각한다.

이러한 공통 속성은 하나의 테이블에 있어야하며 특정 사용자에 대한 전용 속성은 이전 테이블을 상속 한 '서브 테이블'에 있어야합니다. vonPetrushev가 말했듯이.

관련 문제