db最佳实践:数据+布尔列还是仅数据?

时间:2014-05-28 02:38:34

标签: sql database database-design

我正在Postgres数据库中为一组游戏设计一个表格。每个游戏既可以由管理员维护,也可以没有管理员。如果游戏中有管理员,则会有一个admin_id字段,其中包含管理员的ID。

如果游戏没有管理员,我首先想到的是admin_id数据字段为NULL。如果游戏确实有管理员,admin_id将包含整数类型的用户ID。像这样:

admin_id
--------
15282    -- admin
9283     -- admin
NULL     -- no admin
81234    -- admin

另一个替代方案是另一个布尔列,即has_admin,由于显而易见的原因,这是真的和错误的:

has_admin | admin_id 
----------|----------
true      | 15282     
true      | 9283     
false     | NULL
true      | 81234

我的问题是,has_admin专栏是不必要的毛病?或者是否有正当理由将其保留在那里,例如,如果我经常查询数据库以查找游戏是否有管理员?

2 个答案:

答案 0 :(得分:1)

嗯,布尔值实际上并不占用太多空间,所以这不会导致任何大小问题。 但是,拥有has_admin是很麻烦的,因为就像你说的那样:

if ($obj->admin_id){
    // do stuff
}

与:

相同
if ($obj->has_admin === true){
    // do stuff
}

因为有必要经常检查你从数据库中得到什么

if ($obj->has_admin === true && $obj->admin_id){
    // do stuff
}

这完全没用:)

希望这有帮助

答案 1 :(得分:1)

添加has_admin是一种去规范化,因此您可能会引入异常,例如:

true      | NULL     
false     | 9283

由于效率原因,有时需要执行此类操作,但在这种情况下,您可以轻松地将has_admin导出为:

admin_id is not null 

所以没有理由添加这样的属性

相关问题