优化方式解决以下问题

时间:2012-02-02 22:10:16

标签: python sql django optimization

假设我有一个地图坐标x和y的数据库表。我获取了我想要显示的内容并使用PIL创建地图图像。

我创建了一个图像,遍历每个地图图块以粘贴背景图像,一切都很好。

现在,瓷砖上可能有n个玩家,一个怪物,一个npc,一个门户或其他任何东西。 如果图块上有任何对象,我需要粘贴特定图像。

问题:如何检查瓷砖上是否有东西? DB结构应该是什么?

每个玩家都有位置(FK到MapTile的位置)。如果我查询DB以找出tile上有任何player / monster / npc的位置会很痛苦,所以我在每个坐标中添加一列objects_count。如果是> 0然后我寻找出现。

然后它看起来像:

if objects_count:
    if query_for_players_exists:
        show player
    elif query_for_monster_exists:
        show monster
    elif query_for_npc...
        show npc
    and so on.

我可以将M2M用于具有泛型关系的表,但是IMHO泛型关系并不那么快。 请记住,查询集由49个磁贴组成,如何才能轻松找出磁贴上存在的对象?

2 个答案:

答案 0 :(得分:0)

我头脑中的第一件事就是以下内容。如果对象的密度不是很高(例如,小于15%,这是可计算的),则可能包含这些字段的表:x, y, objects。其中objects可能是腌制数组或列表的其他文本表示形式。磁贴名称列表。

如果您的地图足够密集,您最好将其拆分为方形非重叠块并将其保存为对象的基质(矩阵的大小是常量并取决于视口大小)。当然,对象本身也必须序列化为矩阵单元格。

但有一件事是荒谬的,你无法获得太多表现“对象”的“简单”表现。您需要以某种方式打包它们以减少行级操作。

答案 1 :(得分:0)

为什么要为每个磁贴或每个磁贴+可能的对象运行查询?运行1查询以返回所有切片的所有对象,并按切片遍历结果集。

即使每个瓷砖有100个对象,其中有49个瓷砖,结果集中只有4900个。

fetch database rows and store resultset in some data structure
foreach tile
  if( have tile in DB resultset)
    place all object from tile