我将拥有一个包含数百万条目的数据库表,例如在线商店的产品。
如果有一个缺货,我想以某种方式标记它,我想将它从任何findAll()
sql提取中排除。
因此我通过以下选项之一:
select * from products where availcount > 0
boolean available = 'true'
字段,如果缺货我将其设置为false,然后查询将为...where available = 'true'
问题:这会有什么不同吗?是否有理由选择其中一种选择?
答案 0 :(得分:2)
我会坚持库存水平(int availcount
)。位字段通常非常difficult to index,除非数据存在大量偏差,因此缺货产品的数量为1%或更少(因为您可能只会搜索库存产品) ,标志上的任何索引都将被闲置。)
由于您似乎已经存储了实际库存水平,因此不将available
存储在库存指示器中会让您在尝试保持两列同步时感到头痛。
最后,许多RDBMS允许您添加COMPUTED列(或者失败,将available
指示符添加到VIEW),这将允许您从实际{available
指示符的逻辑推导1}},没有任何存储开销。
修改强>
availcount
上的索引(对于查询availcount
和WHERE availcount = 0
)将同样取消 - SARGable作为索引如果产品通常按其他标准搜索,则可能不需要索引。availcount > 0
之外,还可以在代码中进行此确定,例如您的实体类上的其他is available in stock ?
方法。答案 1 :(得分:0)
如果您已经拥有availcount列,则没有理由添加新的列,您的availcount > 0
会这样做。
如果由于其他原因不需要计数,并且只是想在计数或布尔值之间做出决定,请考虑更新该列而不是过滤有多难。
如果你只有一个布尔值,你只需要在产品缺货(或重新进入)时触摸。计算更复杂:每次进行销售或重新进货时都需要更新。这更复杂,可能会影响性能,还有一些需要关注的案例。所以,除非你需要将计数用于其他目的,否则最好坚持使用布尔值。
答案 2 :(得分:0)
我认为只要在相关列中有索引,这两个选项在SELECT
上同样有效。
索引availcount
对此列的任何更新都会有一个小的惩罚(我想这个列会经常更新)。另一方面,拥有available
列会为您的数据库添加冗余(即,它不会被规范化),您可能希望避免这种情况。