Database 数据库设计问题

Database 数据库设计问题,database,database-design,Database,Database Design,我们的数据库包括一个用于存储用户特定数据的用户表,每个用户都有一个状态,即active或inactive。使用用户表中的is\u active布尔字段指示状态就足够了 同时,对于“非活动”用户,我们在另一个字段中保留其他信息,这对于处于相反(“活动”)状态的用户来说是不相关的(因此设置为null) 我的问题:在用户表中保留Is_active布尔字段以明确指示状态,或者根据可用的次要标准(附加信息的可用性,仅当用户处于“非活动”状态时,附加信息始终存在)实际派生状态,这是一种更好的设计吗 也就是说

我们的数据库包括一个用于存储用户特定数据的用户表,每个用户都有一个状态,即
active
inactive
。使用用户表中的
is\u active
布尔字段指示状态就足够了

同时,对于“非活动”用户,我们在另一个字段中保留其他信息,这对于处于相反(“活动”)状态的用户来说是不相关的(因此设置为null)

我的问题:在用户表中保留
Is_active
布尔字段以明确指示状态,或者根据可用的次要标准(附加信息的可用性,仅当用户处于“非活动”状态时,附加信息始终存在)实际派生状态,这是一种更好的设计吗


也就是说,
is\u active
字段在DB规范化方面看起来是多余的,但同时,可用于导出它的逻辑在一开始就不那么明显,这使得有关状态的查询看起来很麻烦,并且包含非显式逻辑。

保留is\u active字段。数据库有一种改变的方式来适应随着时间的推移而产生的需求。谁知道呢,您可能希望使用“无关”字段来存储有关活动用户的信息。

如果有人处于非活动状态,然后又变为活动状态,则可以填写另一个字段,请保留“处于活动状态”字段

总的来说,出于其他人解释的各种原因,我更愿意为此设置一个特定的标志

但除此之外。。。您是否有专门包括两种类型中的一种的查询(例如,“非活动且创建时间超过一年的用户列表”或“向上个月未登录的所有活动用户发送电子邮件”)

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


我认为,如果你最近发现需要对第三类或第四类用户建模,最好不要使用布尔值。最好的方法是存储和使用有关活动的数据。在某些应用程序中,这可能是付款。在其他情况下,可能是最后一次登录。(关于不活动的数据不是我所说的。)

其次是明确的标志。但是布尔数据类型没有足够的不同值(duh),某些查询优化器无法比布尔列上的完整表扫描做得更好。有些dbms支持部分索引或基于函数的索引,可以提高布尔型数据库的性能;如果您使用标志并且dbms支持该标志,请使用该标志


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

我的数据库中有类似的字段,对最终用户很有用,这样他们就可以一眼就知道发生了什么。如果您的DBMS支持它,我会将is_active设置为一个计算字段(基于您的非活动标准),并在其上添加索引。您可能必须创建一个计算字段引用的用户定义函数,这可能会阻止在其上放置索引,但我认为您无论如何都应该避免在查询中使用计算字段作为条件


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

取决于您的最终目标。我不认为使用is_active字段会显著降低规范化程度,因为您没有跨表重复数据。此外,它还使与数据库交互变得更加容易,以便有一个字段,您可以检查其状态以查看用户是否处于活动状态。它还避免了当用户处于非活动状态时(假设is_active字段不为null),其他字段无法更新的问题。但后来我一直被告知,第三范式是应用程序性能和数据完整性之间的一个很好的折衷点。@ PHEDBAQ,我注意到那些设计数据库或稳定对象的非数据库专家,他们经常忘记考虑数据如何在设计中随时间保持或改变。