zoukankan      html  css  js  c++  java
  • 数据库设计

    我个人比较熟悉的是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;
    }
  • 相关阅读:
    CSP 2020 提高组第一轮
    初赛胡扯
    Sublime安装SublimeServer插件开启本地服务器
    Error [ERR_PACKAGE_PATH_NOT_EXPORTED]: No "exports" main defined in XXX ode_modules@babelhelper-compilation-targetspackage.json
    Vue解决less-loader报错 TypeError: this.getOptions is not a function
    Vue-cli项目关闭eslint检查
    Typora添加主题
    Oracle存储过程中EXECUTE IMMEDIATE 执行结果是空时怎么继续执行
    存储过程--异常捕获
    git和github的基本使用(2)
  • 原文地址:https://www.cnblogs.com/byfei/p/14104406.html
Copyright © 2011-2022 走看看