【问题标题】:Should you create separate tables for fixed options?您应该为固定选项创建单独的表吗?
【发布时间】:2019-04-23 00:13:14
【问题描述】:

如下所示,在我的数据库设计中,如果您愿意,我正在为“选项”创建表。例如,RFP 阶段。其中包含“完成”、“投标”等内容。

我这样做是因为有人在某个已删除的问题中向我推荐了它。这是正确的方法吗?还是应该只将这些选项存储为文本,因为只有 5 种左右的可能性?

【问题讨论】:

  • 最好在姐妹网站 DBA Stack Exchange 上询问。

标签: sql postgresql database-design


【解决方案1】:

附加字段

如果您的可能值列表(例如rfp_stage)不仅仅包含名称,那么您肯定希望在您的设计中添加一个查找表。例如,要跟踪用于“完成”的颜色和用于“投标”的另一种颜色,那么您需要在 rfp_stage 查找表中添加第二个字段 colorname

单个字段

如果每个 RFP 阶段的名称是唯一值,没有上面讨论的颜色等附加项目,那么您可能希望使用没有任何查找表的字符串列。

您可以在您的应用中强制执行一系列可能的值。

作为应用程序执行的备份,如果您使用功能强大的数据库系统,例如 Postgres,您可以 define a domain 可能的值并要求该字段始终在该域中具有值。尝试使用意外值添加或更新行将失败,并由数据库引擎引发错误。

处理值的变化

再一次,如果任何阶段的名称都可能发生变化,例如“Bidding”更改为“Out forbid”(含义相同,措辞不同),那么查找表作为一个单一的有用更新措辞的地方。无需对多行的值执行大规模更新。

国际化

同样,如果你需要本地化每个RFP阶段的显示,比如用法语或日语显示“Complete”和“Bidding”,那么你需要添加查找表。您可能还有另一个查找表来保存本地化字符串,但这超出了本答案的范围。搜索 Stack Overflow 和 DBA Stack Exchange 以获取更多信息。

枚举

最后,有些人可能会使用数据库中的枚举作为替代值来表示每个可能的值。例如,“1”表示“完成”,“2”表示“投标”,等等。我自己通常会避免这种方法,因为它会使从行中读取数据变得尴尬和不便。

上下文

与许多设计决策一样,没有明确的黄金法则。上下文很重要。

【讨论】:

  • 除了#3(名称更改) - 如果您需要创建多语言应用程序(以 2-3 种固定语言),那么单独的查找表是存储本地化字符串的好地方。
  • 我确实做到了,必须制作这种多语言!好电话。
  • @Arvo 谢谢,我添加了本地化
猜你喜欢
  • 2018-03-20
  • 1970-01-01
  • 2018-05-18
  • 1970-01-01
  • 2015-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多