一起做网游吧【3】:数据库结构

趁着老婆还在睡觉,可以再更新一下网游教程的内容。本来这个内容要放到上一节中的,但写的时候忘了,只好单独做一个。
先看下数据的定义:

       -record( counter, {
           type,
           value
          } ) .
-record( game, {
           id,
           enable = false,
           pid = none,
           name,
           info=none,
           test_mode = true
          }).
-record( player, {
           count_id,
           id,
           nick,
           password,
           login_errors = 0,
           pid = none,
           socket = none,
           disabled = false,
           online = false,
           ingame = false,
           now_play=0,
           game=[]
          } ).
-record(client, {server = none, player = none, game=none}).

其实,我对上述的数据定义的某些内容并不是绝对的非常的熟悉(之前提到过,数据库的内容我知道的很少)。因为在我刚开始学习erlang的时候,看到了Joe Armstrong提到的openpoker(我希望是这个名字,好几年前了)的服务器,当时在国外,费了好几天的时间,才找到最后公开的源代码,然后,就照搬了一下。比如对于上面的counter,就从未查看过它存的到底是什么内容。从使用的方法上来说,主要是记录其他数据表的个数,然后,作为每个数据在数据表中的唯一的id。这里的每个数据表都是set类型的,也就是说,一对一的。由于erlang的record的中,是否是同一个记录,看record的第一个元素,所以player就有了一个count_id的属性。count_id主要是防止id重合的,最后有没有用到需要到最后查看代码才能知道。
game,从实际上来讲,这个并非其本意,因为在真实的网游服务器中,这是一个节点或者一个进程,至于这个进程的功能,可能是一个大型的游戏,也可能是一个很微型的游戏(比如猜拳),甚至是某个特定功能的npc之类的,在这里,我基本上都是一个小游戏,因为这个教程并不想做的非常的复杂和非常的大,这样,重复的代码比较少。而我之前可能也提到过,这个游戏可以动态的添加或者减少某些小游戏。id对于某个小游戏来说,是唯一的,客户端参加哪一个小游戏,也主要是靠这个id。enable是表明该游戏是否可以允许客户接入,如果不允许的话,客户不应该看到这个游戏。name不用说了,就是游戏的名字。info,本来是存储各个小游戏自己的结构的,但最后没有用到,在这次的整理过程中,也说不定会用到,就暂时留着。test_mode,主要指定小游戏目前是否处于测试状态,在本篇教程中,刚开始的小游戏一直是test_mode,而如果一个游戏是test_mode的话,就需要手动的来启动,而不能随着主程序一起启动。pid负责存储游戏运行的进程id,在互相通讯的时候需要用到。
player中的字段的含义从表面上基本都可以看得到,game本意是存储在各个小游戏中的数据,但到目前为止,没有用到,说不定在教程中写着写着就用到了。socket,online什么的,其实是沿用openpoker的,因为当时可参考的资料很少,就从它里面抽出了部分代码。
client,是服务器的整体结构,但并不往数据库中写。定义在这里只是防止其他文件需要。
以上的代码内容,存储在schema.hrl中。是时候出去买早点和叫醒小懒猫了。

发表评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据