2013-01-03 2 views
0

작업 테이블을 추가하려고하는데 현재이 문제에 접근하는 방법에 대해 현재 확률이 높습니다.구성원 작업 테이블 데이터 모델 제안

내가 자세히 설명하기 전에.

우리는

  • 속도
  • 블로그를 추가 이미지
  • 에 코멘트를 게시 이미지
  • 갱신 이미지를 이미지를 추가 웹 사이트

    • 에 다른 작업을 할 수있는 회원이 게시물
    • 블로그 게시물 업데이트
    • 블로그 게시물에 대한 의견
    • 등 등

    작업 테이블은 그들의 감시 목록에 추가하려는 경우 우리의 사용자가 다른 회원의 활동을 "시계"할 수 있습니다.

    는 I 현재라는 테이블의 다음 컬럼으로 member_actions 생성

    [UserID] [actionDate] [actionType] [refID] 
    

    [REFID] 중 화상 상기 DB에 ID 나 블로그 게시물 ID, 또는 다른 실행 가능의 ID 항목에 대한 참조 수 테이블 (예. 이벤트)

    [actionType] 등의 조치 이름을 가진 열거 열 (등 imgAdd, imgUpdate, blogAdd, blogUpdate는, ...)입니다

    [actionDate] 삭제 얻을 레코드를 결정합니다 D 매 90 일 ... 그래서 우리는 행동을 유지하지 않습니다 영원히

    내가 함께 캠 현재 MySQL의 쿼리는 내가있을거야 주어진, 그래서 기본적으로

    SELECT act.*, 
         img.Title, img.FileName, img.Rating, img.isSafe, img.allowComment AS allowimgComment, 
         blog.postTitle, blog.firstImageSRC AS blogImg, blog.allowComments AS allowBlogComment, 
         event.Subject, event.image AS eventImg, event.stimgs, event.ends, 
         imgrate.Rating 
        FROM member_action act 
        LEFT JOIN member_img img ON (act.actionType="imgAdd" OR act.actionType="imgUpdate") 
            AND img.imgID=act.refID AND img.isActive AND img.isReady 
        LEFT JOIN member_blogpost blog ON (act.actionType="blogAdd" OR act.actionType="blogUpdate") 
            AND blog.id=act.refID AND blog.isPublished AND blog.isPublic 
        LEFT JOIN member_event event ON (act.actionType="eventAdd" OR act.actionType="eventUpdate") 
            AND event.id=act.refID AND event.isPublished 
        LEFT JOIN img_rating imgrate ON act.actionType="imgRate" AND imgrate.UserID=act.UserID AND imgrate.imgID=act.refID 
        LEFT JOIN member_favorite imgfav ON act.actionType="imgFavorite" AND imgfav.UserID=act.UserID AND imgfav.imgID=act.refID 
        LEFT JOIN img_comment imgcomm ON (act.actionType="imgComment" OR act.actionType="imgCommentReply") AND imgcomm.imgID=act.refID 
        LEFT JOIN blogpost_comment blogcomm ON (act.actionType="blogComment" OR act.actionType="blogCommentReply") AND blogcomm.blogPostID=act.refID 
        ORDER BY act.actionDate DESC 
        LIMIT XXXXX,20 
    

    좋아하다 매주 90 일 이상 된 작업 삭제 ... 회원 쿼리 작업 기록을 표시하기 위해이 쿼리를 사용하는 것이 합리적일까요?

    또는 에 새 텍스트 열을 추가해야합니다. member_actions member_action 테이블을 빠르게 쿼리하기 위해 json 또는 xml 형식으로 몇 가지 세부 정보를 저장할 수있는 [actionData] 테이블이 필요합니다.

    테이블 크기를 늘리고 쿼리 복잡성을 줄이지 만 테이블은 이전 항목에서 정기적으로 제거됩니다.

    결국 100k 멤버가 몇 개 밖에 없으므로 member_action 테이블의 테이블 크기에 신경 쓰면 특정 세부 정보가 포함 된 text [actionData] 열이 표시됩니다.

    [actionData] 모델로 기울고 있지만 권장 사항이나 고려 사항을 알려 주시면 감사하겠습니다.

    또 다른 고려 사항은 img 또는 blog에 대한 테이블 항목이 삭제 될 수 있다는 것입니다. 그래서 조치를 취할 수 있지만 참조 레코드가 없음 ...이 것은 문제에 추가됩니다.사전에

    감사

  • 답변

    1

    사용자 인터페이스 문제를 다루기 때문에 성능이 중요합니다. 모든 조인은 인덱스가있는 경우에도 시간이 걸립니다. 그리고 데이터베이스를 쿼리하면 모든 테이블 (또는 인덱스)의 레코드가 잠기므로 삽입 속도가 느려질 수 있습니다.

    그래서 레코드의 텍스트를 유지함으로써 데이터를 비정규 화하는쪽으로 기울어 있습니다.

    그러나 중요한 고려 사항은 사실 이후에 텍스트를 업데이트 할 수 있는지 여부입니다. 즉, 데이터를 만들 때로드합니다. 그러면 바꿀 수 있습니까? 변경 사항 (트리거 및 저장 프로 시저를 포함 할 수 있음)에 비추어 데이터를 유지 관리하는 문제는 많은 추가 복잡성을 초래할 수 있습니다.

    데이터가 정적 인 경우 문제가되지 않습니다. 테이블 사이즈는 너무 걱정하지 않아도 될 것 같아요. 데이터베이스는 메모리를 관리하도록 설계되었습니다. 테이블 캐시는 현재 활성 멤버에 대한 페이지를 포함해야합니다. 특히 오늘날의 서버 영역 내에있는 100,000 명의 사용자에게 항상 메모리 크기를 늘릴 수 있습니다.

    +0

    또 다른 고려 사항은 img 또는 블로그에 대한 테이블 항목이 삭제 될 수 있다는 것입니다 ... 그래서 나는 행동을 취할 수 있지만 참조 기록이 없다 ... 확실히이 문제에 추가됩니다 ... – robert

    +0

    @robert. . . 일부 값을 캐시하는 것은 부분적인 해결책 일 수 있습니다. 텍스트가 표시되지만 기본 객체는 표시되지 않습니다. –

    1

    나는이 방법의 경계 것 - 당신이 조인뿐만 아니라 select 문에서 계속 성장하는 것 (그리고 스파 스 여분의 열됩니다 모니터링 할 행동의 종류를 추가).

    이 테이블에 두 개의 여분의 열이있는 것은 무섭다 고 생각합니다.이 쿼리는 상당히 자주 실행되는 것처럼 들리므로 효율적으로 만드는 것이 좋은 생각 인 것 같습니다.

    +0

    그래서 .... 조금 혼란스러워. 효율성을 위해 [actionData] 열을 사용해야한다고 생각하십니까? – robert

    +0

    다른 고려 사항은 img 또는 blog에 대한 테이블 항목이 삭제 될 수 있다는 것입니다 ... 그래서 액션이 있지만 참조 레코드가 없습니다 ... – robert