2013-01-01 9 views
0

MySQL을 최적화하는 것과 관련하여 인터넷에서 여러 가지를 읽었습니다.2 개의 테이블 또는 1 개의 큰 테이블 MySQL을 가졌습니까?

친구에 관한 테이블이 있습니다. 그리고 저는 두 종류의 친구가 있습니다 : 전문가와 "사회적"(전문적이지 않은) 친구.

내 질문은 :

하는의 내가 친구 (5 개 수백만 전문과 5 백만 사회) 10 수백만 행이 있다고 가정 해 봅시다. 는 더 나은 3 열

-idFriend1, -idFriend2와 테이블에 그들 모두를 가지고

-isProfessional인가 아니면 단지 2 열이 두 테이블 (전문 및 비전문 친구)를 가지고하는 것이 좋습니다 (그리고 단지 절반의 행 수)?

그런데이 테이블에서 몇 가지 작업을 수행해야합니다. 따라서 프로세스에 참여할 때와 없을 때 가장 좋습니다.

+0

나는 id에 대한 전문 친구의 목록을 검색하고 싶다 (그리고 다른 한편으로는 id를위한 비 전문가 친구 목록). 그런 다음 사용자의 세부 정보 (이름, 전자 메일 등)로 테이블에 가입해야합니다. 나는 그것에 어떤 갱신도, 다만 삽입하고 삭제하지 않을 것이다. – Kalzem

+0

'idFriend1'과'idFriend2'는 무엇을 의미합니까? 서로 어떻게 관련이 있습니까? 그리고 같은 사람 ("친구")도 "전문적"이고 "사회적"일 수 있습니까? – BellevueBob

답변

3

"최상"평가는 나머지 모델에서 이러한 엔티티를 사용하는 방법과 작성하려는 쿼리의 종류에 따라 다릅니다.

전문가와 사회 친구들이 정말로 (직업적 또는 사회적 지위 이외의) 동일하면, 나는 하나의 테이블 만 만들 것입니다. 전문직 친구가 직업 명, 직장 이름, 회사 이름 등 소셜 친구 (좋아하는 음료, 좋아하는 스포츠 등이있을 수 있음)와 다른 몇 가지 속성이있는 것으로 밝혀지면 서로 다른 하위 집합 테이블이 순서에 있습니다.

FriendID와 모든 일반적인 속성 (이름, 나이, 주소)을 나열하는 친구 테이블, 실제로는 세 개의 테이블이 순서대로 있습니다. 프로페셔널 친구 테이블 (프렌드 ID에 대한 전문적 속성을 나열 함). (FriendID에 대한 사회적 속성을 나열하는) 소셜 친구 테이블이 있습니다. 이렇게하면 모든 공통 속성을 가진 엔티티로서 유효성 검증을위한 수퍼 세트와 서브 세트 테이블이 있습니다. 당신은 또한 친구가 동시에 융통성있는 사회적, 직업적 친구가 될 수 있는지 결정할 수 있습니다.

그래도 우리는 테이블 활용 방법이나 나머지 데이터 모델과의 관계에 대해 알지 못하기 때문에 "최고"라는 주문이 많습니다.

+0

Prof & Soc Friend는 동일한 "엔터티"입니다 (이들은 동일한 테이블 "사용자"입니다). Prof & Soc Friends 테이블과 함께하고 싶은 일은 전문 친구 목록과 소셜 친구 목록을 2 개의 다른 HTML 테이블에 나열하는 것입니다. (그리고 어떤 때는 전문 (또는 사교) 친구들 목록 만 보여주는 페이지도 있습니다). 유일한 상호 작용 : 나는 prof/social friend를 추가하거나 제거 할 수 있습니다. 그리고 내 DB에서, 나는 사용자 테이블에 이러한 테이블을 결합하여 사용자에 대한 모든 정보를 얻습니다. – Kalzem

1

나는 당신의 질문을 오해하고, 친구가 누구이며, 그들 사이의 관계의 웹을 정의 할 필요가 있다고 생각합니다. 이 경우 나는 그들의 이름 등 하나의 테이블에 친구 정보를 넣을 것이고, 그들 사이에 링크가있는 다른 테이블을 가질 것이다. 둘 다 친구 1, 친구 2에서 자신의 ID에 대한보고 통합 쿼리를 할 필요가 특정인의 친구를 검색 할 때

CREATE TABLE FRIEND (
    id int auto_increment primary key, 
    name varchar(20) 
); 

INSERT INTO FRIEND (name) 
VALUES 
('Andrew') 
('John') 
('Sally') 

CREATE TABLE RELATIONSHIP (
    relationshipId int auto_increment primary key, 
    friendId1 int, 
    friendId2 int, 
    isProfessional boolean 
); 

INSERT INTO RELATIONSHIP (friendId1, friendId2, isProfessional) 
VALUES 
(1, 2, TRUE), 
(1, 3, FALSE); 

우정은 상호이기 때문에.

그렇지 않으면 표의 크기를 두 배로 늘리지 만 내 경험이 느린 조합은 피할 수 있습니다.

+1

다른 생각이 들었습니다.isProfessional를 관계 테이블로 이동하면 어떨까요? 이것은 Andrew가 John의 전문 친구가 될 수 있지만 Sally의 사회 친구 –

관련 문제