我个人比较熟悉的是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;
}