天天看點

資料庫設計

我個人比較熟悉的是mysql,我就說說我經曆過的項目的資料存儲方式。

不管怎麼設計玩家表是必不可少的

1.以系統建表

這種建表方式就會有很多的表,這種設計一般字段都是簡單資料類型,不會用blob.這樣設計資料庫的人他們是函數式思想,他們的遊戲系統應該也是獨立于玩家的,比如背包系統

玩家對象裡面隻存一個背包Id,背包管理系統管理所有玩家的背包,管理背包Id和背包對象,就是他們設計上,玩家和背包是一樣的,都有對象和管理類,通過背包Id去關聯。這樣的設計系統之間的耦合度比較低,

凡是都是正反面的,這樣的設計由于系統之間耦合度比較低,開發系統就相對于對其他系統沒什麼依賴性,但是人物調用背包系統的時候還得去背包管理系統拿資料,就假如背包Id搞錯了

就拿到别人的背包了。

2.就一個表

這樣的資料庫設計就隻有一個玩家表,這種設計一般字段都是Blob的資料類型,這樣設計資料庫的人他們是面向對象的思想,他們的遊戲系統是依附于玩家系統的,比如背包系統

玩家對象裡面直接初始化背包對象,背包管理系統就隻管理一個玩家的背包,通過玩家對象可以直接拿到他的背包,這樣就不會存在拿錯背包的情況。這樣的設計系統之間耦合度就比較高,

這樣的設計的話,那麼加字段是比較麻煩的,我們當初的設計是字段之間用的特殊符号分隔,然後用64bit壓縮,統計資料比較麻煩。字段是有順序的,加字段也隻能在後面加,也不能删除字段。

3.也是一個表

也是隻有一個玩家表,也是Blob的類型,但是利用了json,打包解包,字段可以随便加了,也好統計,php是能解析json的。但是由于引入了key,是以儲存了多餘的資料。

Json::Value BagCell::ToJson()
{
  Json::Value root;
  root["TemplateID"] = m_nItemTemplateId;
  Json::Value attrList;
  TUint16 nTotalLen = m_DynamicAttr.GetLen();
  for (TUint16 i = 0; i < nTotalLen; i++)
  {
    Json::Value attr;
    tagDynamicAttr &pAttr = m_DynamicAttr.GetData(i);
    if(pAttr.Key != TAG_DYNAMICATTR_SIZE)
    {
      attr["key"] = pAttr.Key;
      attr["value"] = pAttr.Value;
      attrList.append(attr);
    }
  }
  root["AttrList"] = attrList;
  return root;
}      
bool BagCell::FromJson(Json::Value& root)
{
  m_nItemTemplateId = root.get("TemplateID", -1).asInt();
  m_DynamicAttr.clear();
  Json::Value &attrList = root["AttrList"];
  for (Json::Value::iterator it = attrList.begin(); it != attrList.end(); ++it)
  {
    Json::Value &node = *it;
    tagDynamicAttr attr;
    attr.Key = node.get("key", 0).asInt();
    attr.Value = node.get("value", 0).asInt();
    m_DynamicAttr.Add(attr);
  }
  return true;
}      
上一篇: 資料庫設計
下一篇: 資料庫設計