首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java中访问树状数据库的设计模式?

Java中访问树状数据库的设计模式?
EN

Software Engineering用户
提问于 2012-07-13 08:44:17
回答 2查看 2.4K关注 0票数 4

我正在为一个locap LARP系统开发一个角色扮演角色查看器/管理程序。这些角色可以获得类似树状结构的技能。这里有很多技巧,而且每个角色都有很多技能。

我知道我可以导入Java swing库来访问一棵树,但我觉得这可能会使我陷入困境,因为需要做的就是访问一个类似树的数据库,而角色只需要知道他们可以访问这些技能的一个子集。

我不确定树设计模式是否是最好的选择(例如,为每个字符已知的技能实例化一棵树,并根据需要添加/删除部分),还是“做一些聪明的事情”,并使用每个字符的列表来查看数据库(外部树)的哪些部分(技能)是“拥有的”。

我的技能大致上是这样的:

Course catogory -> Weapon Type -> Actual Weapon -> Proficiency-->Special Skill,它很深。更进一步说,我们不需要知道每个层次上的是什么,只有孩子们,直到你击中叶子,并向上一片。

我的数据库实际上已经存在于LARP网站上,所以如果我不需要复制它,那就太好了。这是一个样本

代码语言:javascript
复制
Weapons and Shields     Warrior Priest Scout Mage 
1H Weapon Proficiency     3        6     6     9 
1H Weapon Specialisation  6        12    12    18 
1H Weapon Expertise       12       24    24    36 
1H Weapon Mastery         24       48    48    72 

后来:

代码语言:javascript
复制
Magic           Warrior       Priest        Scout         Mage 
Learn Spell     9 x (l + 1)   9 x (l + 1)   6 x (l + 1)   3 x (l + 1) 
l = spell level,  
...
Create Talisman 9 + l         9 + l         6 + l         3 + l 
l = level, 
EN

回答 2

Software Engineering用户

回答已采纳

发布于 2012-07-13 14:39:31

在普通(关系)数据库中使用树是很困难的。如果存储得当,每个技能只引用其父技能,并且试图找到孩子和兄弟姐妹需要花费很长时间,即使是使用一个小表。这在一定程度上可以通过数据库的非规范化(添加列来为每个技能提供完整的祖先)来解决,但是您必须知道树中的最大级别数,并将其硬连接到DB设计中。

考虑到人类必须发明你的数据,不可能有太多的数据,所以我会把它放在你自己的树结构中。每个节点都会引用它的父节点,并有一个其子节点的列表,这样您就可以根据需要绕着它转。您只需要一个简单的技能类,包含父类、子列表、名称和相关数据,因此它的操作和使用非常简单。

使用地图(java.util.HashMap可能是最好的,因为您将知道树的大小)来定位每个条目。将每个技能对象按名称放入其中,按键,最有可能是按名称。因此,如果你想知道“长剑”,你可以在地图上找到它的名字,现在你有了所有的信息,加上它的父母和它的所有孩子。

(有一件事情并不那么简单:在读取DB时,您可能会得到不在树(和Map)中的父级的名称。你得马上创造出来。这意味着当从DB读取新技能时,它可能已经在树中了。因此,您不需要添加它,您只需填写信息和家长。(如果父母不在树中,则必须动态创建它。)

试着只显示父列表和其子列表。将所有内容都显示为简单的表也可能有效。但是,一旦你开始在显示中折叠树的部分,它就变得棘手。做一个好的树/大纲/资源管理器/表/列表比这里的其他工作要多得多。

几年前我确实使用了swing库JTree。如果你必须将整棵树显示为一棵树,这可能是你最好的选择。不幸的是,我需要使它成为表的一部分,事实证明跳过JTree并直接展开和折叠JTable中的行更容易。这是一个巨大的努力。因此,例如,不要让任何人说服您将成本添加到每一行,在每个行中,所有成本都在他们自己的列中对齐。

票数 2
EN

Software Engineering用户

发布于 2012-07-13 12:36:29

用于树状数据结构的规范设计模式是访客。从根节点(或当前节点)开始,按顺序访问每个节点(预顺序、后置顺序、所需的任何顺序),在每个节点执行所需的任务。

从您的描述中还不清楚,但我的印象是,返回显示当前节点的所有主要子节点(即当前节点的所有子节点而不是其后代)的信息所需的信息的访问者将工作。这假设你的技能被分解成越来越精细的类别(战斗,->,武器,->,近战,->,边缘武器,->短刃,->匕首)。玩家可以钻到任何类别,看看他们的能力是什么。你也可以折叠那些只有一个孩子的类别(例如,如果一个人只有一种技能,就直接去做,不要让他们选择一串单一的链接)。

票数 4
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/156659

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档