我将拥有一个包含数百万个条目的数据库表,例如,一个在线商店的产品。
如果一个缺货,我想以某种方式标记它,并且想从任何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 = 0availcount > 0)将与位字段上的索引相同地取消SARGable,尽管如果产品通常通过其他条件进行搜索。
除了在数据库中导出is available in stock ?之外,还可以在代码中获取此确定信息,例如实体类上的其他bool isAvailable() { return availcount > 0 ;}方法。

07-28 04:17