Sql 我应该使用布尔“确认用户”标志还是确认用户表?

Sql 我应该使用布尔“确认用户”标志还是确认用户表?,sql,database,postgresql,database-design,relational-database,Sql,Database,Postgresql,Database Design,Relational Database,我想知道在数据库设计中哪个更正确。 假设我有以下模拟用户表: User id (big_integer) name (string) email (string) password_digest (string) confirmed (boolean) 用户通过电子邮件确认其帐户后,“确认”字段设置为TRUE。 这是一个好的设计,还是我应该创建一个保存已确认用户ID的表,例如: Confirmed User id (big_integer) user_id (reference) 当我向查找

我想知道在数据库设计中哪个更正确。 假设我有以下模拟用户表:

User
id (big_integer)
name (string)
email (string)
password_digest (string)
confirmed (boolean)
用户通过电子邮件确认其帐户后,“确认”字段设置为TRUE。 这是一个好的设计,还是我应该创建一个保存已确认用户ID的表,例如:

Confirmed User
id (big_integer)
user_id (reference)
当我向查找表添加“已启用”字段时,我也面临同样的问题,例如:

City
id (big_integer)
name (string)
enabled (boolean)
与:

Enabled City
id (big_integer)
city_id (reference)
该标志当然会使选择数据变得更容易,无需连接,但我将存储所有这些真/假值,而事实上,我可以跳过这些值,只将与真对应的值存储在确认/启用的表中,但这里是连接


我知道存储所有布尔值在内存方面并不重要,但我想知道哪种方法在数据库设计中更正确,以及原因。

根据应用程序的要求,您可以采用任何一种方法

如果您需要的是一个true / false指示,则考虑将其包含在用户表中。在用户表DDL中将默认值设置为false。适当时将其更新为true。这将是一个更平坦的设计,不需要加入来查找用户的确认状态

如果为用户创建一个单独的表“已确认”,则可以使用它来维护用户的“已确认”标志设置为true/false的历史记录。如果用户可以将已确认的更改值从true更改为false并返回,则这可能是有意义的。您可以有一行记录每个事件。您可以跟踪与确认相关的其他详细信息,如确认的时间、确认的描述等。这将需要与用户表连接以获取用户的确认状态


同样的逻辑也适用于城市表的启用标志。

在特定情况下,这两种方法都是可以接受的。作为一个州,你的问题是征求意见,因为你没有提供足够的指导,在两种方法之间做出合理的选择。@GordonLinoff,我没有问人们认为哪种方法是正确的,我问的是哪种方法在数据库设计方面是正确的。如果这两种方法都是正确的,即它们没有违反任何规范化规则,那么这就是我的答案,谢谢。嗨。这是一个常见问题。怎么可能不呢?例如google“stackoverflow数据库设计我应该使用一个布尔标志,还是两个表”。总是用谷歌搜索你的问题/问题/目标/设计的许多清晰、简洁、具体的版本/变体/措辞,包括和不包括你的具体字符串/名称/代码,并阅读许多问题的答案,这将为你进一步的谷歌搜索提供信息。如果你在应用所学知识并重复这一点后没有找到答案,那么就提出一个问题。使用最常用的关键字作为标记。使用最佳搜索作为标题。我当前的一般评论是re better/best等:在工程中没有更好/最好的东西,除非你定义它。同样不幸的是,所有合理的实用定义都需要大量的经验,其中包含大量的因素,这些因素与对细节的敏感度混乱相互作用。做简单的设计。当你通过测量证明一个设计和你能想到的所有备选方案都有问题时,不管这意味着什么,然后问一个非常具体的问题。这也应该定义更好/最好@philipxy,在提问之前,我认真地试着寻找一个类似的问题,但我没有成功,也许我的词汇量不到位。我将结束这个问题。谢谢。此外,可能还有其他数据点只适用于已确认的用户,而ConfirmedUser表将是他们的合适位置。