我将拥有一个包含数百万个条目的数据库表,例如,一个在线商店的产品。
如果一个缺货,我想以某种方式标记它,并且想从任何findAll()
sql提取中排除它。
因此,我虽然使用以下选项之一:
每个产品已经有一个整数的可用性。无论如何,我必须将其设置为0。select * from products where availcount > 0
或者我可以引入一个boolean available = 'true'
字段,如果缺货则将其设置为false,然后查询将为...where available = 'true'
问题:这会有所不同吗?是否有理由应首选这些选项之一?
最佳答案
我会坚持库存水平(int availcount
)。位字段通常非常difficult to index,除非数据中存在较大的偏斜,使得大约有1%或更少的产品缺货(而且由于您可能只搜索有库存的产品,标志上的索引将不被使用)。
由于无论如何您似乎已经存储了实际的库存水平,因此在库存指示器中不存储available
可以使您避免试图使两列保持同步。
最后,许多RDBMS允许您添加COMPUTED列(否则,将available
指示符添加到VIEW),这将允许您从实际的available
逻辑推导availcount
指示符,而没有任何存储开销。
编辑
根据下面的评论,请注意,availcount
上的索引(对于查询WHERE availcount = 0
和availcount > 0
)将与位字段上的索引相同地取消SARGable,尽管如果产品通常通过其他条件进行搜索。
除了在数据库中导出is available in stock ?
之外,还可以在代码中获取此确定信息,例如实体类上的其他bool isAvailable() { return availcount > 0 ;}
方法。