【问题标题】:How could I do calculations in a Stored Procedure? [closed]如何在存储过程中进行计算? [关闭]
【发布时间】:2017-03-27 17:18:38
【问题描述】:
我有一个数据库,可以处理数千行,用于存储我为战舰游戏编写的 AI 算法的统计数据,该游戏使用 C# 作为编程语言。
我是否应该在 SQL 层上进行计算,例如平均未命中率、平均命中率等?
如果是这样,这些是否应该存储在数据库中它们自己的列下?还是应该在运行计算平均值而不存储在任何地方的查询(或使用 R 编程语言)时计算它们?
我问这个问题是因为我从来没有因为这个原因使用过数据库,而且我不知道如何构建它。
谢谢。
【问题讨论】:
标签:
c#
sql-server
r
database
database-design
【解决方案1】:
这取决于你在做什么。
专业存储过程:
- 如果您有不同的客户端访问相同的后端功能,它们都可以共享相同的后端代码,从而减少重复
- 在相同的场景下,它有助于确保一致性
- 如果您的客户端代码涉及对数据库服务器的多次来回访问,则可以通过在存储过程中将代码移动到服务器来避免相关的延迟
专业前端:
- 更容易移植到新数据库
- 更易于调试和备份 - 使用存储过程,您可能需要专门的软件,并且即使数据库本身是免费的,您也可能需要付费,但如果您在前端完成所有操作,则这种可能性要小得多李>
- 总体而言,开发人员的学习曲线更简单,学习曲线更少
- 如果原本在服务器上的代码在客户端上,那么它可能分布在多台机器上(每个客户端一台),避免服务器上的瓶颈。
【解决方案2】:
你“应该做什么”可能是个人喜好问题,但如果是我,我会做你在返回数据的存储过程中提到的计算。我不会将平均值作为列存储在数据库中。
【解决方案3】:
这取决于您是否希望在未来重复使用这些记录,或者任何进一步的分析都取决于这些数据。如果这样做,您可以获得这些派生值并将它们存储到数据库中,这将在您的 C# 代码运行时节省系统 I/O 资源,但作为回报,它会占用一些额外的空间。相反,如果你不这样做,如果你没有大量的计算域,它不会对系统造成巨大的负担,而且还可以节省磁盘空间。
最重要的是,这取决于您的实际情况。
更新:如果使用数据库,也可能是系统资源问题,需要open连接到目标数据库,这可能需要一些资源。