Design patterns 设计-在SQL中存储可执行代码的替代方案

Design patterns 设计-在SQL中存储可执行代码的替代方案,design-patterns,database-design,web-applications,api-design,architectural-patterns,Design Patterns,Database Design,Web Applications,Api Design,Architectural Patterns,我正在开发一款浏览器小游戏,我遇到了一个设计问题,我能想到的唯一解决方案都是糟糕的 它是一个典型的web应用程序——Angular2/HTML/JS前端,带有PostgreSQL DB的Java服务器,内容托管在nginx和Tomcat上 用户可以与各种具有自定义行为的NPC(非玩家角色)交互。我已经泛化了这个逻辑,NPC作为配置行存储在DB中 身份证号码:1 姓名:山姆全国人大代表 ImgURL:“www.mygame.com/img/npc/sam.png” 访问mygame.com/n

我正在开发一款浏览器小游戏,我遇到了一个设计问题,我能想到的唯一解决方案都是糟糕的

它是一个典型的web应用程序——Angular2/HTML/JS前端,带有PostgreSQL DB的Java服务器,内容托管在nginx和Tomcat上

用户可以与各种具有自定义行为的NPC(非玩家角色)交互。我已经泛化了这个逻辑,NPC作为配置行存储在DB中

  • 身份证号码:1
  • 姓名:山姆全国人大代表
  • ImgURL:“www.mygame.com/img/npc/sam.png”
访问mygame.com/npc/1会向Java中的后端API发出GET in JS,以从DB中获取该行,并绑定和显示这些值。将这些作为配置行存储在数据库中允许我添加新的NPC或编辑现有NPC,而无需重新部署服务器或前端代码

到目前为止,标准。然而,我希望NPC山姆友好,拜访他会增加玩家的收入。另一个NPC,史蒂夫,应该是敌对的,从玩家的库存中移除金钱或物品。Bob NPC有时可以解锁对玩家的搜索

这就是我被困的地方: 每个NPC都有完全不同的任意行为,这意味着我需要每个NPC的可执行代码

在我看来,我的两个选择都不好,但方式不同

  • 每个NPC都有自己的Java类,是服务器逻辑中的第一类实体。所有NPC都实现一个
    interact()
    方法,添加或更改NPC需要代码推送

  • 每个NPC在DB中获得一个新列,其中包含可执行文件JS,将通过Java中的脚本引擎运行。这有点危险,但也只是一个麻烦。编写能够通过与Java代码库交互来调用DB函数的JS,然后将其保存为数据库中的字符串,这是一件很麻烦的事情


  • 我目前正在使用选项2,但不太深入,我想知道是否有一种公认的方法可以更好地处理类似的事情。

    将源代码存储在数据库中与存储图像或文档没有多大区别。然而,我相信您正在寻找一些声明性语言()来描述NPC,而不是实现它的命令式程序。最简单的方法是创建基于XML或JSON的可扩展DSL。在这种情况下,XML文档可以作为角色配置文件数据的一部分存储在数据库中。

    您能精确说明什么是NPC吗?@serge编辑的帖子,但我也将其放在这里:NPC代表非玩家角色。在webapp中,这些屏幕的一般形式相同,但内容不同。NPC有助于推动游戏性——他们发布任务或与玩家交易,等等。我想问一下