2010-12-01 5 views
2

나는 "재능"을 기반으로 웹 사이트를위한 새로운 프로젝트를 시작하고있다 - 예를 들면 :관계형 데이터베이스 디자인 (MySQL의)

  • 모델
  • 배우
  • 가수
  • 댄서
  • 음악가

내가 제안하는 방법은 이러한 재능이 각각 h 자체 테이블을 열어 특정 사용자에게 레코드를 매핑하는 user_id 필드를 포함합니다.

웹 사이트에 가입 한 모든 사용자는 이러한 재능 중 하나 이상의 프로필을 만들 수 있습니다. 재능에는 재능이있을 수 있습니다. 예를 들어 배우는 TV 배우 또는 극장 배우 또는 음성 배우가 될 수 있습니다.

예를 들어 나는 모델 (Catwalk Model)과 배우 (TV 배우, 연극 배우, Voiceover 배우) 인 사용자 A가 있습니다.

내 질문은 :

  1. 내가이 사용자의 하위 재능을 저장하는 별도의 테이블을 생성해야합니까?

  2. 이 사용자의 최상급 재능 조회는 어떻게해야합니까? 나는. 각 재능의 ID 필드가 있어야 사용자 테이블에 있습니까? 또는 각 최상위 재능 테이블에서 해당 user_id가 존재하는지 확인하기 위해 조회를 수행해야합니까?

  3. 내가 알아야 할 사항은 무엇입니까?

답변

1

오케이 죄송합니다. 잘못된 답변입니다. 이것은 다른 접근 방법입니다.

내가 보는 방식으로 사용자는 여러 직업 (배우, 모델, 음악가 등)을 가질 수 있습니다. 일반적으로 내가 생각하는 것은 먼저 객체에서 생각한 다음 테이블로 변환하는 것입니다. P.O.O. 당신은 클래스 사용자와 하위 클래스 Actor, Model 등을 가질 수 있습니다. 각각의 TvActor, VoiceOverActor ...와 같은 하위 클래스를 가질 수 있습니다. DB에서는 각 재능과 하위 항목에 대한 테이블을 가질 수 있습니다. 동일한 기본 키 (사용자의 ID)이므로 사용자 4와 Actor 및 Model 인 경우 Actor 테이블에 하나의 레지스트리가 있고 모델 테이블에 ID가 4 인 두 ID가 있습니다.

저장은 쉽다. 복잡한 부분은 정보를 검색하는 것이다. 데이터베이스가 상속 (내가 MySQL이 있다고 생각하지만 난 그것을 시도하지 않은)의 개념을 해달라고 때문 ..입니다 그래서 당신이 원한다면 이제 사용자 4의 subclases, 내가 세 가지 옵션을 참조하십시오

  • 복수를 ID가 4인지 묻는 각 재능 및 하위 테이블에 대한 SELECT.

    SELECT * FROM id = 4; SELECT * FROM TvActor where id = 4;

  • 는 사용자 왼쪽에서

    SELECT * 가입 User.id = TvActor.id LEFT ON TvActor 가입 User.id = Actor.id 왼쪽에 배우 가입 왼쪽에 모든 재능과 subtalent 테이블에 합류 큰 쿼리를 확인 JOIN ... 어디 User.id = 4; 당신은 늘 모든 테이블을 물어 그래서

  • 는 사용자가 가지고있는 각각의 재능과 subtalents의 참조를 저장하는 사용자와에서는 N × N 관계의 인재 테이블을 만들 수 있습니다. Talents 테이블에 대한 쿼리를 만들어야 두 번째 쿼리에서 어떤 테이블을 요청해야하는지 확인할 수 있습니다. alt text

    이 세 가지 옵션 중 각각

어쩌면 다른 하나 =)

행운

PS 거기에 .. 자신의 장점과 단점을 가지고 : 아 내가 다른 옵션을 찾을 here 또는 어쩌면 두 번째 옵션이 향상되었을 수도 있습니다.

+0

환호하는 친구 - 제 생각에는 아마도 제 3의 옵션을 생각할 것입니다. 분명히 데이터 복제 (각 사용자의 재능 목록 저장)가 있으므로 사용자 재능이 삭제 된시기를 확인해야하므로 두 테이블의 항목이 모두 삭제됩니다. 그러나 그것 이외에 그것은 모두 좋다! – GSTAR

+0

안녕 친구, 그냥 마지막 질문 하나만 - 내 talent_user 테이블에서 "활성"필드를 포함 할 계획입니다. 사용자가 해당 재능을 켜고 끌지 결정합니다. 따라서 모든 모델을 찾기 위해 쿼리를 수행 할 때 모든 모델이 활성 = 1 인 곳을 찾고 싶습니다. 어떻게 이것을위한 가입을 만들까요? – GSTAR

+0

나는 "활성"필드가 필요하다고 생각하지 않는다. 아이디어는 .. 사용자가 모델과 TvActor이고 Talent_User 테이블에서이 사용자는 재능 "모델"과 관련이있을 뿐이며 재능 "TvActor".. 그게 당신이 어떤 재능을 가지고 있는지를 아는 방법입니다. 사용자와 관련된 재능을 알았 으면 적절한 테이블을 물어보십시오. 복잡한 것입니다. – pleasedontbelong

2

사용자에 관한 모든 정보 (이름, dob, 사용자에 관한 기타 정보)가있는 하나의 표가 있어야합니다. 재능 (ID, talentName, TopLevelTalentID ("sub"재능을 저장하기위한 "Parent"재능에 대한 참조)에 관한 모든 것을 가진 하나의 테이블을 가져야합니다. UserID와 TalentID를 저장하는 UserTalents : 사용자와 재능 간의 많은 관계에 대한 세 번째 테이블이 있어야합니다.

http://www.deeptraining.com/litwin/dbdesign/FundamentalsOfRelationalDatabaseDesign.aspx

2

이 객체 지향 사고와 관계형 모델 사이의 차이점과 유사점의 일부를 보여주는 좋은 질문은 다음과 같습니다

여기에 3 NF에 도착하는 방법을 설명하는 글이다.

우선 테이블을 만드는 것과 관련된 엄격한 규칙은 없습니다. 모델을 만들려는 문제 공간에 따라 달라집니다 (그러나 각 테이블에 대한 필드가 필요하지 않으며 디자인 오류를 구성합니다. 주로 융통성이없고 쿼리하기 어렵 기 때문에). 이 경우 예를 완벽하게 허용 설계를위한 이 이름은 어떤 재능을 가지고 추적하는 것이 위의 디자인은 당신이 계층 TalentTypes을 가질 수 있도록 할 테이블

Names (Name, Email, Bio) 

Talents (TalentType references TalentTypes, Email references Names) 

TalentTypes (TalentType, Description, Parent references TalentTypes) 

을 가지고하는 것입니다, 당신은 하나의 테이블을 가질 것이다에서 당신 (중복 등록을 피하기 위해) 모든 이름을 얻을 수 있다면, 당신은 재능 목록을 얻을 수있는 단일 테이블을 가지며 새로운 재능 유형 및/또는 부속 유형을 쉽게 추가 할 수 있습니다.

각 특성 유형에 대한 특수 파일을 실제로 저장해야하는 경우 일반 특성 테이블을 참조하는 테이블로 추가 할 수 있습니다. 이것은 단지 그림 것을 알 마 그림

Models (Email references Talents, ModelingSalary) -- with a check constraint that talents contain a record with modelling talent type 

으로 , 재능 테이블에서 급여를 가지고 특정 재능을위한 테이블을 가지고 있지 분별 수 있습니다.

특정 재능에 대한 테이블로 끝나는 경우 특정 재능이나 재능이 속성을 상속하는 클래스의 종류로 Talents 테이블을 볼 수 있습니다.

3

귀하의 질문에 답변하기 전에 ... 나는 그 user_id가 Talents 테이블에 있어서는 안된다고 생각합니다. 여기에있는 주요 아이디어는 "많은 재능을 가진 재능과 많은 재능을 가진 한 재능"입니다. . 그래서 관계되는 N × N, 당신은 중간 테이블을해야해야

참조 : 지금 many to many

나는이 사용자의 하위 재능을 저장하는 별도의 테이블을 생성해야합니까?

동적 인 항목 (하위 항목 추가 또는 제거)을 수행하려면 재귀 관계를 사용할 수 있습니다. 그 자체에 관련되는 테이블

TABLE TALENT 
------------- 
id PK 
label 
parent_id PK FK (a foreign key to table Talent) 

참조 : recursive associations

가 어떻게이 사용자에 대한 최상위 재능의 조회를 수행해야합니까? 나는. 사용자 테이블에서 각 ID가 재능에 해당하는 필드가 있어야합니까? 또는 각 최상위 재능 테이블에서 을 조회해야 해당 사용자 ID가 인 지 확인할 수 있습니까? 이전에 모델을 사용하는 경우 테이블의 재능 여러 수준이 .. 당신이 특정 수에 자신을 제한 할 수 있습니다 포함 할 수있는 TREE 지금 때문에

, 쿼리를 만들 수있는 악몽을 수 있습니다 당신이 당신의 재능의 테이블에 원하는 레벨 나는 두 가지로 충분하다고 생각합니다. 귀하의 질의가 더욱 쉬워 질 것입니다.

내가 알아야 할 사항은 무엇입니까?

최고 수준의 재능 실 거예요 PARENT_ID을 가지고 있기 때문에 ... 외부 키가 널 (null)을 ALOW해야 재귀 관계를 이용하여 ...

행운을 빕니다! :)

수정 : 확인 .. 모델을 만들었습니다.그것은 더 나은

model

편집 두 번째 모델을 설명하기 위해 (크리스마스 트리 모양 = D) 다른 방법이, 모델 & 탤런트와 배우 사이의 관계가 & 인재가 1 × 관계임을 참고) = 사용자가 재능이있는 경우 (the same link on the comments)

alt text

쿼리에있는 세 개의 테이블을 조인 .. 찾을 것으로 희망을 수행하는 이 도움이

+0

안녕하세요. 오해가 있었을 수도 있지만 기본적으로 내가 말하고자하는 것은 b 그 재능을 가진 각 사용자에 대한 항목을 만드는 별도의 재능 테이블. 각 인재 테이블의 필드는 해당 재능과 관련이 있습니다. – GSTAR

+0

@pleasedontbelog +1 @GSTAR, 실제로 나는 그것이 오해되었다고 생각하지 않습니다.나는 당신이 위의 디자인에서 가진 모든 재능을 얻는 방법을 볼 수 없다고 생각한다. 그렇다면 저희에게 알려주십시오. 우리는 재능을 가진 모든 재능이나 재능을 가진 모든 사용자를 얻는 방법을 보여줄 수 있습니다. – Unreason

+0

안녕하세요, 다시 기뻐하셨습니다. 재능 관련 정보를 저장하려면 어떻게해야합니까? 예를 들어, 모델에 특정되거나 배우에게 특정한 정보를 저장해야합니다. 다른 두 개의 테이블 (모델, 액터)을 생성한다고 가정합니다 -이 두 테이블을 사용자와 어떻게 연결해야합니까? – GSTAR

관련 문제