如下所示,在我的数据库设计的多个地方,我正在为“选项”创建表,如果你愿意的话。例如,RFP阶段。其中包含“完整”、“竞标”等内容。
我这么做是因为在一个被删除的问题中有一次有人向我推荐了它。这是正确的方法吗?或者我应该将这些选项存储为文本,因为只有5种左右的可能性?
最佳答案
附加字段
如果您的可能值列表(如rfp_stage
包含的不仅仅是一个名称),那么您肯定希望在设计中添加一个查找表。例如,要跟踪用于“Complete”的颜色和用于“Bidding”的另一种颜色,则需要第二个字段color
以及name
查找表上的rfp_stage
。
单一字段
如果每个RFP阶段的名称是唯一的值,没有像上面讨论的颜色这样的附加项,那么您可能希望使用不带任何查找表的字符串列。
您可以强制应用程序中可能的值的列表。
作为应用程序执行的备份,如果您使用的是功能强大的数据库系统,如Postgres,则可以define a domain的可能值,并要求该字段在该域中始终具有值。尝试添加或更新具有意外值的行将失败,并由数据库引擎引发错误。
处理价值变动
再次重申,如果任何阶段的名称有任何变化的可能性,例如“投标”更改为“投标”(相同的意思,不同的措辞),则查找表作为更新措辞的单一位置是有用的。无需跨多行执行值的批量更新。
国际化
同样,如果您需要本地化每个RFP阶段的显示,比如用法语或日语显示“Complete”和“Bidding”,那么您需要添加查找表。您可能还有另一个查找表来保存本地化字符串,但这超出了这个答案的范围。搜索堆栈溢出,可能DBA堆栈交换更多信息。
枚举
最后,有些人可能使用数据库中的枚举作为备用值来表示每个可能的值。例如,“1”表示“完成”,“2”表示“投标”,等等。我通常自己避免使用这种方法,因为这样会使从行中读取数据变得笨拙和不方便。
上下文
与许多设计决策一样,没有明确的黄金法则。背景很重要。
关于sql - 是否应该为固定选项创建单独的表?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55802618/