【发布时间】:2015-06-01 13:27:08
【问题描述】:
我正在构建一个比传统库存系统更少的系统来为浏览器/手机游戏提供动力。基本主体是building 具有某些resources 的stock。这些buildings 的每小时产量减少了每座建筑物的进口并产生出口。这些作品基于structure 作为building 的类型以及建筑物的水平和容量。
我的难题是如何以可扩展的方式布置这些库存表。我能够构建表格,以便每一列都是资源。示例:
building_id | structure_id | energy | food | water
--------------------------------------------------
1 | 1 | 459 | 19 | 0
这种方法的好处是我可以写一些方便的views 和events 并完全从mysql 中支持这个逻辑。我可以每小时触发一个大型更新语句来生成事务。
这种方法的缺点是我必须将每个资源写成表格中的一列。这也将出现在我的数据库表中。我预计只有 150 个左右的资源。
我一直在使用的另一个选项是将其构建为一个基本的库存系统。所以,有一个看起来像这样的stock 表:
stock_id | building_id | resource_id | qty
-------------------------------------------
1 | 1 | 3 | 19
4 | 1 | 2 | 0
5 | 1 | 1 | 459
这种方法的好处是代码的可扩展性,可以轻松输入新资源以增强游戏体验。
这种方法的缺点是我必须执行多个UPDATE 和SELECT 语句才能执行一个buildings 生产。以及每个building。我计划将服务器限制为 250k buildings。这可能会变得很费力。
总而言之,我正在寻找最优化的方法。我将拥有一组有限的资源,并且我能够使用查询构建代码来创建升级类来处理添加资源。但这也变成了大量的代码来构建数据库。
有人对此有什么想法吗?
编辑: 为了清楚起见,我正在添加生产顺序的工作方式。
- 建筑物必须检查需要从库存中导入哪些内容,以及将释放多少空间容量。
- 建筑物必须检查需要将哪些内容导出到库存中,以及它将占用多少空间。
- 建筑物导入和导出来自
structures表并乘以建筑物等级。 如果我们不超过产能并且我们拥有所有需要的资源,那么构建将改变库存。
这一切,现在可以从所有buildings 上的一个UPDATE 语句正确运行,并且运行速度非常快(尚未在大于100 的集合上进行测试)。但这是基于将每个资源作为一列的设计。我可以使用适当的库存系统样式表实现与现在相同的结构,但我需要 150 个左连接(有 150 个资源)。
【问题讨论】:
-
你的第二个选择是要走的路。您还关注性能而不考虑将运行 MySQL 服务器的硬件。由于第二个选项可让您轻松添加资源,因此无需讨论数据模型 - 这是正确的。没有失败,如果您需要更新大量数据 - 只需执行此操作,将许多更新包装在一个事务中,它会很快。如果您正确配置 MySQL,选择也会很快,并且没有人阻止您创建视图或物化表以提高性能/更易于管理。
-
我的最大案例是 250K 建筑物。由于到目前为止我建造的最复杂的建筑是 4 个进口和 4 个出口,即每个建筑最多 8 个资源行(大多数更少,但假设最坏的情况)。所以 250k 建筑物的 8 个资源行是 200 万次更新。我希望它每小时运行一次。如果以最大容量完成需要 2-3 分钟,这并不可怕,因为它是从一个 cron 任务中运行的,并在每个建筑物中分开 trans 以防止在生产工作时挂起。
-
你能用 SSD 代替机械硬盘吗?
-
这些是对陈旧数据的写入,或“假定”为陈旧数据。尚未确定是否有必要进行特定更新,听起来像是霰弹枪方法
-
@N.B. - 我会在一家公司托管它。