나는 구글이 MySQL을 사용하지 않는 것을 확실히 알고 있지만, 내 경우에는 내가 MySQL을 사용 프로젝트에서 작업 일어날 서클에 매우 유사 기능이 있습니다Google 플러스 서클의 데이터베이스 구조?
- 사용자가 많은 원 에 속할 수를
- 사용자는 추가/
- 게시물 공개하거나 서클에 공유 할 수/개별 사용자 원에서 제거 할 수 있습니다 게시물이 원에 공유하고, 새로운 사용자가 다음이 사용자가 또한 할 수있는이 원에 추가 된 경우
- 게시물을 봅니다.
- 게시물이 서클과 공유되고 사용자가이 서클에서 삭제 된 경우 다음을 수행합니다. 그/그녀는 그/그녀가 게시물 b에서 대답하면 게시물을 볼 수 있습니다. 더 이상 게시물을 볼 수 없습니다.
위의 요구 사항을 통해 알 수 있듯이 데이터베이스에는 많은 부분이 있습니다. 만약 내가 정말로 서클과 개인 사용자 모두에게 공유한다면, 아마 2 개의 One2Many 테이블이 필요할 것이다. 맨 처음에 각 서클의 사용자 목록을 가져 와서 개별 사용자에게만 공유하면 나중에 사용자가이 서클을 편집 할 때 문제가 발생합니다. 현재
, 내 GET이 주위에 해킹 내가 단지 동그라미 1 사용자가 작성하는 각 개별 사용자에 대한 원에만, 심지어 에 공유하는 것입니다.그래서 내 현재 데이터베이스 테이블은 조금 같이 :
circle_to_user :
id
circle_id
user_id
friend_id
게시물 :
id
user_id
is_public
post_to_circle
리튬을 조회하려면 난 그냥 세부 정보를 많이주고 싶어,
$q = Doctrine_Query::create()
->addSelect('s.*')
->addSelect('u.id, u.first_name, u.last_name, u.username, u.avatar')
->from('UserStatus s')
->leftJoin('s.User u')
->orderBy('s.created_at DESC');
$userId = sfContext::getInstance()->getUser()->getUserId();
if ($userId == $viewUserId) {
$q->orWhere('s.user_id = ?', $userId);
$q->orWhere('s.user_id IN (SELECT DISTINCT cu1.friend_id FROM CircleUser cu1 WHERE cu1.user_id = ?) AND s.is_public = ?', array($userId, true));
$q->orWhere('s.id IN (SELECT DISTINCT(us2.id)
FROM
UserStatus us2 INNER JOIN us2.UserStatusCircles usc2 ON usc2.user_status_id = us2.id
INNER JOIN usc2.Circle c2 ON c2.id = usc2.circle_id
INNER JOIN c2.CircleUsers cu2 ON cu2.circle_id = c2.id AND cu2.friend_id = ?)', $userId);
} else {
$q->orWhere('s.user_id = ? AND s.is_public = ?', array($viewUserId, true));
$q->orWhere('s.id IN (SELECT DISTINCT(us1.id)
FROM
UserStatus us1 INNER JOIN us1.UserStatusCircles usc1 ON usc1.user_status_id = us1.id AND us1.user_id = ?
INNER JOIN usc1.Circle c1 ON c1.id = usc1.circle_id
INNER JOIN c1.CircleUsers cu1 ON cu1.circle_id = c1.id AND cu1.friend_id = ?)', array($viewUserId, $userId));
$q->orWhere('s.id IN (SELECT DISTINCT(us2.id)
FROM
UserStatus us2 INNER JOIN us2.UserStatusCircles usc2 ON usc2.user_status_id = us2.id AND us2.user_id = ?
INNER JOIN usc2.Circle c2 ON c2.id = usc2.circle_id
INNER JOIN c2.CircleUsers cu2 ON cu2.circle_id = c2.id AND cu2.friend_id = ?)', array($userId, $viewUserId));
}
내가 위의 정보가 너무 길지 희망 : 사용자가 볼 수있는 게시물의 일이 쿼리가 다소 복잡하고 조인 여러 구성되어 있습니다. 내 질문은 다음과 같습니다.
- 위의 요구 사항을 고려할 때 구현이 만족 스럽습니까? 아니면 개선을 위해 변경해야 할 것이 있습니까?
- 이 유형의 특정 데이터베이스 디자인 문제에 관한 기사를 검색하고 싶지만 많이 찾지 못했습니다.이 유형의 데이터베이스 디자인에 대한 전문 용어가 있습니까
- 다른 유형의 데이터베이스를 사용하는 것과 같은 다른 방법을 제안 하시겠습니까? 또는 탄성을 가진 searchengine으로 게시물을 색인화하고 mysql을 사용하는 대신 검색을 처리하게 할 수 있습니까? 당신이 따라 답을 알려 제발하기 쉽도록하기 위해 나는이 질문을 변경해야합니다 아무것도 찾을 경우
는이 시점까지 읽어 주셔서 감사합니다.
이 문제를 해결 한 적이 있습니까? 비슷한 문제가 있습니다. –
최종 해결책은 실제로 생각했던 성능면에서 최적화되지 않았습니다. 아마 우리는 다시 생각해야합니다. 데이터 구조 (또는 왜 우리가 그렇게해야하는지). – mr1031011