如何在MongoDB中存储双陆棋板?

如何在MongoDB中存储双陆棋板?,mongodb,database-design,nosql,Mongodb,Database Design,Nosql,我是NoSQL数据库的新手,尽管我已经寻找了很多,但我找不到这方面的最佳实践 对于那些不知道的人来说,双陆棋是一种有24个点子(或槽)的棋盘和一个可以包含任何颜色的棋子(被击中的棋子放在棋子上)的棋子的游戏。另外,每个pip(或插槽)可以包含一个或多个相同颜色的部件 我正在寻找的结构应该得到优化,以帮助我快速计算两件事: 这一举措有效吗?要使移动有效,目标插槽必须具有少于两个相反颜色。例如,如果我想移动到插槽4,而我是黑色的,那么插槽4必须只有一个白色碎片(移动后将被击中),或者没有碎片,或者

我是NoSQL数据库的新手,尽管我已经寻找了很多,但我找不到这方面的最佳实践

对于那些不知道的人来说,双陆棋是一种有24个点子(或槽)的棋盘和一个可以包含任何颜色的棋子(被击中的棋子放在棋子上)的棋子的游戏。另外,每个pip(或插槽)可以包含一个或多个相同颜色的部件

我正在寻找的结构应该得到优化,以帮助我快速计算两件事:

  • 这一举措有效吗?要使移动有效,目标插槽必须具有少于两个相反颜色。例如,如果我想移动到插槽4,而我是黑色的,那么插槽4必须只有一个白色碎片(移动后将被击中),或者没有碎片,或者有一个或多个黑色碎片
  • 每个球员的点数是多少?点数是我赢得这场比赛的总骰子数。为此,我需要能够快速检索整个电路板中一种颜色的块的位置。计算将在数据库之外的本地完成。如果您对检索查询结果后如何计算pip计数感到好奇,请查看
我想到的结构是这样的:

{
    1: {
        color: 'black',
        pieces: 2
    },
    2: {
        color: 'white',
        pieces: 1
    },
    3: {}
    // etc, until 24
    24: {}
    bar: {
        {
            color: 'white',
            pieces: 1
        }
    }
}
毫无疑问,这种方法的唯一问题是
。由于该条可以包含任何颜色的片段,因此我必须在
键内创建另一个对象,以便稍后可以添加颜色为
黑色
的片段(如果需要)


有更好的结构吗?此外,我还希望您能提供一些提示和技巧,说明此结构的性能如何。

考虑到您只有1个大小相对恒定的
文档,您可以放心地假设此1
文档将保留在内存中,因此,您不应该过于担心性能问题,因为它只是一个文档—基本上是问我的
HashMap
性能有多好

如果由我决定的话,我会把吧台分成两个吧台——
bBar
wBar
(顺便说一句,在现实生活中,每个玩家旁边都有自己的吧台,用来保存自己的“被吃掉的”棋子)


顺便说一下,任何涉及最佳移动的计算都应该在内存中进行。您不应该将中间计算结果存储在
DB

Hmm中,您可以用于移动并相应地计算电路板。这样做的好处是,您不仅可以存储棋盘,还可以存储玩过的每一个动作。是的,我正在考虑将
移动
存储在
游戏
对象(即包含
棋盘
作为其属性之一的对象)上。然而,我也需要一个缓存的董事会表示,这样我就不必每次需要做数字1和2时都计算当前位置。但是,如果您认为计算速度足够快,那么这是一个很好的选择。会吗?由于游戏机制相对简单,性能不应该成为问题。真正的问题应该是为什么要使用MongoDB,以及您想用它实现什么。是不是只有坚持?或者允许用户“取消”一个或多个动作——或者“重放”游戏?允许(同一玩家和/或不同玩家)同时进行多场比赛?进行博弈分析,试图在各种博弈中找到共同模式?还有别的吗?这将对设计产生影响。不,这将只允许两名玩家在一条直线上相互比赛(即,不回头,也不进行分析)。然而,我还需要提供一个动作的历史记录,所以这就是为什么我也想到要有一系列的动作。