假设我有一个数据库表,我希望根据布尔属性(例如,“flagged”属性)进行过滤。是否更好地向表中添加“flagged”属性,或者创建一个具有基表外键的新表?有什么优点和缺点?
答案 0 :(得分:2)
如果 all 你需要 1 ,那么只需添加简单字段。
但是,你必须要小心你如何索引它。除非这些值严重偏离 2 ,否则你最终会得到一个选择性很差的索引clustering factor 3 ,你实际上会更好关闭全表扫描 4 。
如果您使用标记结合过滤其他字段,请创建一个综合索引,这样就可以更好地选择合适的分数。
1 I.e。您不需要以某种方式“描述”或“增加”两个可能的布尔值中的每一个的其他数据。
2 一个值属于少数(包含false
的行数远小于包含true
的行数,反之亦然) ,你碰巧只过滤了这个值。
3 该链接适用于Oracle,但一般原则适用于所有DBMS。
4 即使在索引存在的情况下,一个体面的DBMS会自动为您做什么。假设的“愚蠢”DBMS只会盲目地使用索引,并且表现甚至比全表扫描更差。
答案 1 :(得分:0)
如果此标志本身具有属性或者它是可重用的,则最好将其创建为另一个表。但如果只是将行标记为true / false,只需创建一个bool列(并节省时间和工作量)
答案 2 :(得分:0)
只需在表中添加列,它就会更好更简单..然后创建一个位图索引,如果在WHERE中使用此列,将加快查询速度
答案 3 :(得分:0)
这取决于。当值与表/关系没有真正关联时,我自己更喜欢添加新表。
这方面的一个很好的例子就是当你有表代表订单时,你想跟踪哪些订单已被打印。我会在订单中添加一个名为printed_orders的新表,其中包含一个外键。
create table printed_orders (
order_id int primary key references order(order_id)
);
如果已打印或未打印,则不是订单的一部分,而是系统/业务规则的一部分。