我想知道在数据库设计中哪个更正确。 假设我有以下模拟用户表:
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值,实际上,我可以跳过它并且只存储与确认/启用相对应的值的值桌子(但这里加入)。
我知道存储所有布尔值在内存方面并不重要,但我想知道哪种方法在数据库设计中更正确,以及为什么。
答案 0 :(得分:1)
您可以根据应用要求采取任何一种方法。
如果您需要的是true/false
的{{1}}指示,请考虑将其包含在confirmed
表中。在User
表DDL中将默认值设置为false
。适当时将其更新为User
。这将是一个更平坦的设计,无需加入即可找到用户的true
状态。
如果您创建单独的表confirmed
,则可以使用它来维护用户的Confirmed_User
标记设置为confirmed
的历史记录。如果用户可以将true/false
的值从confirmed
更改为true
并返回,则这可能有意义。您可以有一行记录每个事件。您可以跟踪与false
相关联的其他详细信息,例如confirmation
,time_of_confirmation
等。这需要与description_of_confirmation
表联接才能获得User
状态用户。
相同的逻辑适用于confirmed
表的enabled
标志。