SQL数据库设计 - 标志还是新表?

时间:2017-04-06 11:55:37

标签: postgresql database-design

我的数据库中的一些用户也将是从业者。

这可以用以下两种方式表示:

  • 用户表中的is_practitioner标志
  • 具有user_id列的单独Practitioner表

我不清楚哪种方法更好。

旗帜的优点:

  • 更少的表格
  • 每个用户只有一个id(因此不会产生混淆,也不会混淆其他表中使用的id)
  • 灵活性(我不必决定字段是否仅限于从业者)
  • 查找从业者的用户级信息(例如电子邮件地址)可能具有速度优势

新表的优点:

  • 用户表中没有空值
  • 更清楚哪些信息仅限于从业者
  • 寻找从业者的速度优势

就我而言,目前,与从业者相关的信息通常是一对多的(例如他们可以工作的地点,或者他们可以工作的班次等)。如果转向我需要为从业者存储简单属性(即一对一),我一点都不会感到惊讶。

问题

  1. 还有其他考虑因素吗?
  2. 要么接近优势吗?

3 个答案:

答案 0 :(得分:1)

你可能想要考虑这样一个事实,即今天的实践者,明天是另一回事。 (并且,我并不是说,不是从业者)。比如说,顾问,作者或您主题领域中的任何变体,您可能希望在“用户”表中跟踪他的最新状态。因此,拥有ProfType字段(专业实践类型)或等效字段可能是有意义的。这样,您拥有标志的所有优点,您可以将其保留为字符串字段并将其保留为空白字符串,或者在需求增长时将其填充为其他Prof.Type代码。

你提到,有一张新桌子,有找到练习者的优势。不,你最好在users表上使用WHERE子句。

然而,您的最后一段(一对多)可能会倾向于整个选择,转而使用单独的表格。您可能还需要考虑,可能的记录数量,可能的增长,复杂查询的重要性等。

答案 1 :(得分:1)

我尝试绘制两个场景,图像中有一些注释。它只是一个草案,只是为了帮助你“看到”各种实体。可能你已经做过类似的事了:在这种情况下请不要考虑我的答案。正如Whirl在他的最后一段中所述,你也应该考虑其他事情。

Draft logical schema

答案 2 :(得分:1)

就我个人而言,我会选择一个单独的表格 - 只要您已经识别出一些仅对于从业者有意义的额外数据(例如:完整的职业头衔,大学,医院或与从业者相关的任何其他实体)。

因此,如果您将来发现更多仅对于从业者有意义的数据和/或识别用户的另一个不同的“子类型”(例如实习生),您只需将字段添加到Practitioner子表或新表中即可实习生。

使用上面@Whirl Mind建议的用户类型字段可能是有利的。

我认为这只是必须在数据库中识别不同类型的对象的一个​​示例,为此我在此处参考我以前的一个答案:Designing SQL database to represent OO class hierarchy