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