2010-12-13 5 views
1

웹 사이트 용 데이터베이스를 개발하려고합니다. 이 웹 사이트에는 등록 된 사용자가 있으며이 사용자는 다른 사용자와 친구가 될 수 있습니다. 전통적인 소셜 네트워킹 사이트와 비슷합니다. 이제 내 문제는 각 사용자의 친구 목록과 프로필 정보를 저장해야한다는 것입니다. 각 사용자는 자신의 프로필 ID를가집니다. 이 외에도 각 사용자는 친구를위한 그룹을 만들 수 있으며 두 사용자 간의 우정의 상태를 나타내는 상태 필드도 있습니다. 이제 데이터베이스 테이블 수 대 테이블 크기

내가 두 솔루션의 생각이 작업을 수행합니다 :

  1. 각 사용자는 프로필 ID와 그의 다른 프로필 정보가있는 테이블라는 이름의 프로파일을 유지하고 글로벌 친구 테이블이, 즉이 자신의 프로필 ID와 그의 친구 프로필 ID. 그리고 다른 필드는 그룹을 설명 할 것이고 사용자는 특정 친구와 우정에 대한 지위를 선택했습니다.

  2. profile이라는 테이블을 유지 관리합니다. 각 사용자는 프로필 ID와 위와 같은 다른 프로필 정보를 가지며 friends_profileid와 같은 사용자 별 별도의 친구 테이블을 가지고 있으며 각 사용자는 자신의 친구 목록을 가지고 있습니다. 다른 모든 정보가 있습니다.

위의 두 기술 중 어느 것이 더 적절합니까? 필자는 MySQL Server 5.0을 사용하고 있으며 추상적 인 데이터 유형과 배열 유형을 사용하는 것을 고려했지만 프론트 엔드 구현이 더 복잡하고 어렵고 번거로워졌습니다. 첫 번째 기법은 단일 테이블의 행 수를 매우 빠르게 증가시키는 반면 두 번째 기법은 테이블 수를 사용자 수에 비례하여 증가시키는 것입니다. 무엇이 더 충고됩니까? 테이블 수가 많거나 행 수가 많습니까?

두 번째 기법은 단일 테이블에서 검색의 오버 헤드를 줄이는 반면, 스키마를 반복해서 저장하는 오버 헤드는 무엇입니까? 이런 유형의 상황에 가장 적합한 방법은 무엇입니까?

답변

3

SQL은 관계의 고정 세트를 통해 행변수 수와 함께 작동하도록 설계되었습니다.1 테이블 당 사용자 (단지 내 머리 위로 떨어져)와

문제 :

  1. 에 액세스 하드와 어려운 유지 테이블의 무리와 함께 붙어. 여러 사용자에 걸쳐 쿼리를 실행할 수있는 간단한 방법이 없습니다. 단일 쿼리에서 이러한 테이블을 "분해"하려고 쿼리 크기를 제한합니다. 대부분의 SQL/ORM 계층은이 문제를 처리하는 좋은 방법을 제공하지 않습니다.
  2. 생성 된 쿼리는 다른 테이블로 대체되어 "동적"이어야합니다.이 기능은 "모양을 변경하지는 않지만"정적 분석기가이를 알기는 어렵거나 불가능합니다 (어쩌면 "템플릿"? - 더 복잡한. 고마워!). 이것은 SQL DDL/DQL이 유효한지 (해당 도구가 사용되는 경우) 확인하는 데 적용되며 추가 작업없이 정적으로 생성 된 ORM을 사용하지 못하도록하며 쿼리 프로세서/분석기에 더 많은 부하를줍니다.
  3. 이/또한 일반적으로 나쁜 쿼리 계획 및 일반적인 경우와 같이 전체적인 성능으로 이어질 것입니다 수, 각 테이블은는 (100,000? 어떤 감사의 말씀!) 는 잠재적으로 거대한 부족 독립적으로을 처리 할 필요가 논리적 소재지. 당신은 또한 상위 RDBMS 한계 (다른 한편으로 2 백만 레코드가있는 테이블은 "작음")를 추진할 수도 있습니다.

결론 :의 강점에 RDBMS를 사용하십시오 - 세계는 지금 ​​수십 년 동안 SQL에서 실행하고있다 (적어도 2 ;-) 대부분의 [사소한] 문제는 여러 번 해결하고있다.

0

테이블의 관점에서 생각하는 것이 아니라 도메인 객체가 무엇인지, 그리고 이들 간의 관계가 어떻게 보이는지 생각해보십시오.

DB 디자인을 실행하고 뒤에서 필요한 조인을 수행하는 잘 정의 된 API 뒤에 데이터베이스 구조를 캡슐화하는 데 사용합니다.

1

추가 사용자 별 "친구"테이블을 만들 필요가 없습니다. 나에게 의미가 있습니다 방법은 더 밀접하게 첫 번째 솔루션과 유사합니다

이 작업을 수행하는 전통적인 방법은, 내 생각, 만들 테이블을을 조인을 사용하는 것을 양방향, 대다 사용자 간의 매핑. 이 테이블에는 두 개의 열이 있으며 두 테이블 모두 users 테이블의 기본 키에 대한 외래 키입니다. 조인 테이블의 항목 (user_friends)은 두 사용자 간의 "우정"을 나타냅니다.

+0

동의합니다. 사용자 1과 2가 있다고 가정 해 봅시다. 이제 user1이 B를 A로 분류하고 user2가 B를 분류합니다. 따라서 분명히해야합니다. user_friends 테이블에 1과 2 & 2 및 1 값을 모두 저장하십시오. 이제 1000 명의 사용자가 있고 각각 50 명의 친구가 있다고 가정하면 테이블 크기는 50,000으로 커지고 친구 목록을 쿼리 할 때마다 엄청난 오버 헤드가 발생하며 친구 목록을 가져와야합니다. 자주. 쿼리 실행 시간은 조그마한 데이터베이스에서도 기하 급수적으로 증가합니다. – sasidhar

+0

나는 이것에 대해 한 번 더 생각해 보았는데, 이것이 전혀 이해가되는지 모르겠다.하지만 주어진 테이블의 친구 목록을 가져 오는 것과 같은 테이블을 쿼리하는 것이 바람직하다. – sasidhar

+0

@ sasidhar : _ "전통적인 소셜 네트워킹 사이트"_라고 말하면 페이스 북을 생각합니다. Facebook에서는 우정이 서로 같습니다. A가 B와 친구라면 B도 A와 친구가되어야합니다. 반대로 B가 A와 친구가 아니면 A는 B와 친구가 될 수 없습니다. 이것은 각 우정을 한 번만 나열하면되므로 표의 크기가 제한됩니다. –

관련 문제