sql - 您应该为固定选项创建单独的表吗?

标签 sql postgresql database-design

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

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

enter image description here

enter image description here enter image description here

最佳答案

附加字段

如果您的可能值列表(如 rfp_stage)涉及的不仅仅是一个名称,那么您肯定希望在您的设计中添加一个查找表。例如,要跟踪用于“Complete”的颜色和用于“Bidding”的另一种颜色,那么您需要第二个字段 color 以及 rfp_stage 上的 name 查找表。

单个字段

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

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

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

处理值的变化

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

国际化

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

枚举

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

上下文

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

关于sql - 您应该为固定选项创建单独的表吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55802618/

相关文章:

sql - Oracle SQL : ORA-01830 when date calculation happens

java - 尝试将 native SQL 转换为 HQL 时出现异常?

c - 每个 udp 数据包有多个或单个请求?

mysql - 用于存储内容主题标签/关键字的最佳 mysql 字段类型

mysql - 对于社会保险号,我应该使用 INT、CHAR 还是 VARCHAR?

mysql - 任何人都可以简化这个 mysql 查询

sql - 如何使用 generate_series() 生成值网格

php - SQL语句选择出现次数超过2次的重复记录

postgresql - postgres 在所有模式中选择

php - PostgreSQL 搜索不工作