2012-05-23 2 views
4

나는 HTML5 멀티 내가 한 게임을 개발하고있다 : 테이블 "키워드"및 "모델"과 N의 관계를 다음과 같은 이미지처럼 보여줍니다효율적인 삽입/MySQL의 m의 갱신 : N 관계는

Database scheme

keyword.idmodel.id은 auto_increment 부호없는 int이며 keyword.keyword은 고유 색인입니다.
효율성을 위해 관계를 관리하는 방법을 찾고 있습니다. 사소한 방법은 다음과 같습니다

  • 선택하면 키워드 이미
  • 존재하는 경우 예 : model_has_keyword
  • 에서 갱신 timesCountroundCount 만약 번호 : insert into keyword

그러나의 증가와 insert into model_has_keyword 동시에 연주하는 사용자들, 사소한 방법이 너무 느려지는 것이 아닌가 걱정됩니다. 그래서 이것을하는 가장 효율적인 방법은 무엇입니까?

StackOverflow에서 검색하는 동안 두 가지 아이디어가 두드러졌지만 두 가지 모두 내 요구에 맞지 않는다고 생각합니다. INSERT INTO 처리 할 것

  1. INSERT INTO table ON DUPLICATE KEY UPDATE col=val
    경우에, 나는 두 테이블에 keywordmodel_has_keyword
  2. REPLACE 문을 삽입하는 또 다른 INSERT INTO 문을 실행할 필요가있을 것이다 : 나는 테이블 키워드의 기록을 교체하는 경우, id이 할당됩니다 다음 자동 증가 값을 사용하여 테이블 model_has_keyword에 대한 참조가 손실됩니다.

저는 전문가가 아니기 때문에, 여기에 뭔가 잘못 이해하면 제게 시정하십시오.

답변

3

관계가 존재하는지 확인한 다음 삽입/업데이트해야합니다.

A.- INSERT 쿼리를 try 블록에 포함하고 오류가 발생하면 업데이트 쿼리를 작성하십시오. 그 관계가 존재하지 않을 때 모든 수표를 저장합니다 ...

B.- 모든 INSERT ON DUPLICATE UPDATE를 만듭니다. 이것은 "A"에서와 똑같을 것이지만 예외에 대해 걱정할 필요는 없습니다.

확실히 두 번째 아이디어는 완전히 잘못되었습니다.

나는 테이블 키워드를 작성하지 않을 경우에만 키워드 자체를 필요로하기 때문에 ... 나는이처럼 내 model_has_keyword을 정의 할

:

CREATE TABLE model_has_keyword (
    model_id   INT NOT NULL, 
    keyword   VARCHAR(50) NOT NULL, 
    timesCount  INT NOT NULL, 
    roundCount  INT NOT NULL, 
    PRIMARY KEY (model_id,keyword) 
); 

을이처럼 업데이트 :

INSERT INTO model_has_keyword 
    (model_id,keyword,timesCount,$myIntValue) 
VALUES 
    ($model_id,$keyword,0,0) 
ON DUPLICATE KEY UPDATE 
    timesCount=timesCount+1,roundCount=roundCount + $myIntValue 
+0

답장을 보내 주셔서 감사합니다! B에서 설명한 방식대로 구현하는 방법을 언급 해 주시겠습니까? 이것이 어떻게 작동해야할지 모르겠다. INSERT INTO 키워드 (키워드) VALUES ('myValue') 중복 키 업데이트에 대해 model_has_keyword.roundCount = model_has_keyword.roundCount + 1, model_has_keyword.timesCount = model_has_keyword.timesCount + myIntValue 중복 키가 검색되지 않으면 model_has_keyword에 삽입이 누락되었습니다. 중복 키가 있으면 예상대로 작동합니다. 마지막으로 중요 : 저장 프로 시저를 사용했거나 소스 (php/js)에서 쿼리 한 것이 었습니까? – grange

+0

그러나 표 키워드는 필요하지 않습니다! – Amarnasan

+0

감사합니다! 당신은 절대적으로 옳았지 만, 또 다른 m : n 관계에 대해서도 키워드 테이블이 필요하다고 언급하지 않았습니다. 따라서 키워드 중복 저장으로 이어질 수 있습니다. – grange