4

我正在开发一个 HTML5 多人游戏,其中我有:n 表“关键字”和“模型”之间的关系,如下图所示:

数据库方案

keyword.id并且model.id是 auto_increment unsigned int 并且keyword.keyword是唯一索引。
为了效率,我正在寻找一种管理关系的方法。简单的方法是:

  • 检查关键字是否已经存在
  • 如果是:更新timesCountroundCountmodel_has_keyword
  • 如果没有:insert into keywordinsert into model_has_keyword

但随着越来越多的用户同时玩,只怕琐碎的方式会变得太慢。那么最有效的方法是什么?

在 StackOverflow 上搜索时,我偶然发现了两个想法,但我认为它们都不符合我的需求。

  1. INSERT INTO table ON DUPLICATE KEY UPDATE col=val
    如果INSERT INTO会被处理,我需要触发另一个INSERT INTO 语句来插入两个表keywordmodel_has_keyword
  2. REPLACE语句:如果我替换table关键字中的记录,id则分配下一个自增值,从而model_has_keyword丢失对表的引用。

由于我不是专家,如果我在这里误解了什么,请纠正我。

4

1 回答 1

3

您需要检查关系是否存在,然后插入/更新。

A.- 将 INSERT 查询包含在 try 块中,如果出现错误,请进行更新查询。当关系不存在时,这将保存所有检查......

B.- 在重复更新上进行所有插入。这将与“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
于 2012-05-23T11:06:53.630 回答