数据库设计-布尔属性或新表

van*_*goz 5 database database-design

假设我有一个数据库表,我想根据布尔属性(例如“标记”属性)进行过滤。是只向表添加“标记”属性更好,还是创建一个具有基表外键的新表?优缺点都有什么?

Bra*_*vic 3

如果这就是您所需要的1 那么只需添加简单字段即可。

但是,您必须小心如何为其建立索引。除非这些值严重倾斜2,否则您最终会得到一个具有可怕选择性和集群因子3 的索引,并且实际上最好进行全表扫描4

如果您按标志与其他字段结合进行过滤,则创建一个复合索引,这样就有更好的机会进行适当的选择。


1即,您不需要以某种方式“描述”或“增强”两个可能的布尔值中的每一个的附加数据。

2一个值属于极少数(包含 的行数false远小于包含 的行数true,反之亦然),并且您恰好只过滤该值。

3该链接适用于 Oracle,但一般原则适用于所有 DBMS。

4即使存在索引,一个像样的 DBMS 也会自动为您完成这些工作。假设的“愚蠢”DBMS 会盲目地使用索引,并且性能甚至比全表扫描还要差。