数据库设计

我个人比较熟悉的是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;
}
原文地址:https://www.cnblogs.com/byfei/p/6389806.html