Database 避免巨大的中间查询连接结果(1.33615E+35行)

Database 避免巨大的中间查询连接结果(1.33615E+35行),database,Database,我需要一个查询来防止产生1.34218E+35结果的连接 我有一个表项约8k项;e、 g.Foo盾、Bar武器,每件物品都是9种不同物品类型的护甲、武器等中的一种。每件物品在物品属性中有多个条目,例如伤害、防御。下面是一个伪代码表示: Table item ( item_id autoincrement, ... item_type_id char, --- e.g. Armor, Weapon, etc level int --- Must be at l

我需要一个查询来防止产生1.34218E+35结果的连接

我有一个表项约8k项;e、 g.Foo盾、Bar武器,每件物品都是9种不同物品类型的护甲、武器等中的一种。每件物品在物品属性中有多个条目,例如伤害、防御。下面是一个伪代码表示:

Table item (
 item_id autoincrement,
 ...
 item_type_id char,    --- e.g. Armor, Weapon, etc
 level int             --- Must be at least this level to wear this item
);

Table item_attribute (
 item_id int references item(item_id),
 ...
 attribute char        --- e.g. Damage, Defense, etc
 amount int            --- e.g. 100
)
现在,一个角色一次总共穿戴9件物品,分别是护甲、武器、盾牌等,我称之为装备。我想建立一个设置列表,使一个属性最大化,但另一个属性最少。例如:对于角色等级100,按伤害列出前10个设置,其中所有物品的防御能力>=100

天真的做法是:

select top 10
 q1.item_id,q2.item_id,q3.item_id,..., q1.damage+q2.damage+q3.damage... as damage
from
 (select item_id from item where item_type = 'Armor' 
     and level <= 100) as q1
 inner join (select item_id from item where item_type = 'Shield' 
     and level <= 100) as q2 on 1 = 1
 inner join (select item_id from item where item_type = 'Weapon' 
     and level <= 100) as q3 on 1 = 1
 ...
where
 q1.defense+q2.defense+q3.defense+... >= 100
order by
 q1.damage+q2.damage+q3.damage,... descending

但是,由于项目中约有8k个项目,这意味着DBMS排序结果的大小接近8000^9=1.34218E+35个不同的设置!有更好的方法吗?

你不能只使用最强大的物品加入吗?应该大幅减少集合大小。从逻辑上讲,最高项目的总和应该提供最高的组合。

我认为您的问题可以通过使用解决。我建议您将数据从数据库中取出,并将其交给一个高度优化的解算器,该解算器是由花了很长时间研究算法的人编写的,而不是尝试用SQL编写自己的解算器。

我要做的第一件事是隔离您的项。不要将设置作为一个整体来看待,而要关注单个项目的总和。除非你的道具与其他道具相互作用,否则你只需在一个道具上最大化状态a,最小化状态B,然后在你的设置中的每个道具上重复这个过程,你就可以走很长的路了。这将大大降低查询的复杂性,即使这意味着需要更多的查询。从长远来看,它应该会让事情变得更快

另一件要问你自己的事情是,获得状态B值多少钱?你想要失去的那一个值多少钱才能获得状态A?如果你能获得1000 A,而只需要获得1 B,那可能是值得的。但是,获得10 A怎么样,但你必须获得9 B才能做到?现在情况有点变化


如果你坚持a:B比例,你可能会分别处理每个插槽,并将每个单独的结果合并到一个查询中。

你是魔兽世界的开发者还是什么?8k物品!OMFG这可能是球员应该根据你的规则优化他/她的装备的任务吗?他们想怎么解决就怎么解决;你只是执行规则。8k物品并不难获得。每种类型不到900项,其中许多可能是通过编程生成的。这是一个玩家应该做的任务。。。我就是那个球员!我不是游戏开发者,我只是拥有所有物品和物品集奖金的公开数据。因为物品属性不会随着等级单调增加,该建议的解决方案存在一个缺陷,即最佳设置低于指定的返回项数……整数线性规划可以通过将问题转化为优化的程序来解决,从而为上述查询提供更快的解决方案。但是,除非我遗漏了一些东西,因为我不理解整数线性规划,否则它不会降低复杂性,也不会用更简单的方法来解决问题?@Derek Frye:如果你或这里的其他人能用SQL编写一个有效的解决方案,我会感到惊讶。如果他们这样做,他们肯定会得到我的支持票。但在我看来,SQL是解决这个问题的错误工具。使用更好的工具并不能改善问题的时间复杂性——无论哪种方法都是NP难的,但这不是避免使用正确工具的理由。你可以在固定时间内用锤子敲入钉子。你也可以用螺丝刀在固定时间内敲入钉子。但这并不意味着这些工具同样适用于这项任务。你是对的,似乎没有人能找到降低问题复杂性的解决方案。也许将其转化为某种优化解算器是fwd的最佳方式。