数据库设计问题

时间:2012-02-21 22:15:08

标签: database database-design

我们的数据库包含一个用于存储用户特定数据的USERS表,每个用户都有一个状态activeinactive。只需在USERS表中使用is_active布尔字段指示状态即可。

同时,对于“非活动”用户,我们会在另一个字段中保留其他信息,这对于处于相反(“活动”)状态的用户而言是无关紧要的(因此设置为空)。

我的问题:在USERS表中保留is_active布尔字段以清楚地指示状态,或者实际根据可用的辅助条件(附加信息的可用性,只有当用户处于“非活动状态”时才会出现?

也就是说,看起来is_active字段在数据库规范化方面是多余的,但与此同时,可用于推导它的逻辑在第一次掌握时并不那么明显,这使得关于状态的查询看起来很麻烦并且包含非显式逻辑。

5 个答案:

答案 0 :(得分:2)

如果有人变为非活动状态,然后再次变为活动状态,则仍可填写其他字段,保留is_active字段。

答案 1 :(得分:1)

最好的方法是存储和使用有关活动的数据。在某些应用程序中,这可能是付款。在其他情况下,它可能是最后登录时间。 (关于不活动的数据不是我所说的。)

接下来最好是一个明确的标志。但是布尔数据类型没有足够的不同值(duh),因为某些查询优化器要比布尔列上的全表扫描做得更好。一些dbms支持部分索引或基于函数的索引,可以提高布尔值的性能;如果使用标志并且dbms支持它,请使用它。

标志看起来像数据,但通常它们是一种伪数据。

答案 2 :(得分:0)

保留Is_Active字段。数据库有一种改变方式,以适应随着时间推移而出现的需求。谁知道,您可能希望使用不相关的字段来存储有关活动用户的信息。

答案 3 :(得分:0)

一般情况下,由于其他人解释的各种原因,我宁愿为此设置一个特定的标志。

但除此之外......您是否有专门仅包含两种类型中的一种的查询(例如“非活动且已创建超过一年的用户列表”或“向所有活动状态发送电子邮件”上个月没有登录的用户“)?

如果是,那么(或包括)该字段的索引肯定会更有效。

我认为,如果您最近发现需要为第三或第四类“用户”建模,最好不要制作此布尔值。

答案 4 :(得分:0)

我的数据库中有类似的字段,这些字段对最终用户非常有用,因此他们可以一目了然地了解正在发生的事情。如果你的DBMS支持它,我会使is_active成为一个计算字段(基于你的非活动标准),并带有索引。您可能必须创建计算字段引用的用户定义函数,这可能会阻止在其上放置索引,但我认为您应该避免在计算中使用计算字段作为条件。

创建包含非活动记录条件的视图,并返回其应用的所有记录的PK。然后将该视图用作需要该条件的任何查询的1个位置。如果性能成为问题,您可以查看索引视图以加快速度。