在Spring中设计一个点系统

时间:2012-07-27 15:52:25

标签: java spring hibernate achievements

我的数据库中已有很多现有数据,并希望开发一种点机制,根据每个用户的操作计算每个用户的得分。

我以可插入的方式实现此功能,因此它独立于主逻辑,并且在实体被修改后依赖于发送的Spring事件。

问题是如何处理现有数据。我不想从现在开始收集积分,而是包括所有数据,直到现在。

最实用的方法是什么?我是否应该以提供index()方法的方式设计我的插件,这将强制我的系统从数据库中获取每个单独的实体,发送一个EntityDirtyEvent,为每个实体触发点插件,然后更新它,让点被保存在每个实体旁边。这可能会导致很多开销,对吗?

最简单的方法是创建一个复杂的存储过程,然后使index()调用该存储过程。然而,在我看来,这似乎也是一件坏事。既然我必须编写用于计算java中的点的逻辑,为什么还要在SQL中再次使用它?此外,一般来说,我不喜欢将业务逻辑分成不同的层。

以前有人这样做过吗?请帮忙。

5 个答案:

答案 0 :(得分:4)

首先让我们区分实施策略和业务规则。

由于您已拥有数据,请考虑直接从数据中获取结果。这形成了数据域模型。设计数据模型以存储所有数据。然后,创建一组查询,视图和存储过程以访问和更新数据。

获得这些视图后,使用数据访问库(如Spring JDBC Template)获取此数据并将其表示为java对象(列表,地图,人员,点表等)。

到目前为止所完成的内容并没有太大变化,无论系统上层发生了什么。这称为模型。

然后,开发规则库或逻辑实现,确定在什么输入,用户操作,数据条件或所有其他条件下,需要什么数据。从数学意义上讲,这就像一个矩阵。在编程意义上,这将是一组逻辑语句。如果这和这是真的,那么获取这些数据,否则获取数据等。这包含了系统中的逻辑。因此它被称为“控制器”。

不要将此逻辑移动到查询/存储过程/视图中。

然后最终为此开发一个前端或“控制台”。在最简单的情况下,开发一个控制台输入系统,它采用..并显示一组结果。这是你对系统的“看法”。

您最终可以将视图开发到Web应用程序中。上述命令行视图仍然可以以Restful API服务器的形式存在。

答案 1 :(得分:2)

我认为这里有一个问题需要考虑:据我所知,数据库中存在大量数据,因此仅创建一种计算点系统的机制的想法可能不是最好的方法。

实际上,如果您不想开始收集点但包含所有数据,则必须处理并计算您现在拥有的信息。是的,第一次运行此操作会导致开销,但正如您所说,您需要计算此数据。

另一方面,您可以包含另一种机制,该机制参与实体中的更改并启动另一个能够计算适用于此特定修改的新指向差异的过程。

因此,您可以使用一个负责计算指向系统的服务,一个用于单个实体,另一个可能更长,可以计算全局点。即使如果您不需要实时计算,也可以创建一个负责启动它的预定作业。

最后,我知道将业务逻辑拆分为两层(Db + Java)并不是一个好方法,但有时需要这样做,例如,如果您需要快速回复最终适用于很多注册管理机构。我发现一些情况除了向数据库添加业务逻辑(作为存储过程等)以管理大量数据并将最终结果返回给浏览器客户端之外别无选择(例如:在一个特定时间内计算过程) )。

答案 2 :(得分:2)

你正试图完成“自举”。您选择的方法应取决于点计算的复杂程度。如果存储过程或普通更新语句是最简单的解决方案,那就这样做。

如果计算很复杂,请编写一个加载现有数据的批处理作业,可能先将其命名为最旧的,然后触发与该数据相对应的事件,就好像它们刚刚发生一样。处理事件的代码应该与处理未来事件的代码完全相同,因此除了批处理作业本身之外,您不必编写任何其他代码。

由于你只打算运行一次,所以请使用最简单的解决方案,即使它很快又很脏。

答案 3 :(得分:2)

你似乎朝着正确的方向前进。你知道你希望你的“点”事物与主应用程序分离。由于暗示你已经在使用hibernate(通过标签!),你可以使用hibernate事件系统(参见here第14.2节)。根据系统的大小/复杂程度,您可以在此处插入点计算(如果它不是大型/复杂系统),或者您可以发布自己的事件以供任何正在监听的软件使用。

任何一种设计方法的要点都是既不知道也不关心你的点数计算。如果您正如我猜测的那样,尝试创建一个相当通用的插件机制,那么您可以从此绑定点向该系统发布您自己的事件。然后,如果您在给定的安装/设置上没有插件,则没有人获取/处理事件。如果您在另一个安装/设置上有多个插件,那么他们每个人都可以根据收到的事件决定他们需要做什么处理。在“点插件”的情况下,它将计算它的点值并存储它。不需要存储过程....

答案 4 :(得分:1)

有两种不同的方式。 一个是你已经知道 - 在数据库中查询已更改的数据。在这种情况下,当可能没有变化时,您正在访问数据库,这可能会减慢您的流程。

第二种方法 - 每当数据库发生更改时,数据库都将触发事件。您可以使用CDC(更改数据捕获)。它将最小化开销。

您可以在Spring Integration

中查找更多选项