kra*_*626 7 sql database oracle database-design lookup-tables
我正在使用Orable数据库,我正在添加几个查找表.
一般的问题是查找表是否应包含代码和描述,代码是FK返回主表,还是查找表只包含描述,而FK是否应该返回主表.
我在争论代码/描述对.我觉得,如果我有type = Contractor和code = CN一个存储过程应该说where type='CN',而不是只具有type=Contractor无代码和存储过程中这样说:where type='Contractor'因为如果我要显示什么:General Contractor给用户,而不是Contractor.然后我必须改变存储过程.我觉得我不应该这样做.(更改存储过程需要在dev中重新编译,迁移到测试,由客户端重新测试,以及迁移需要经历涉及两周等待期的变更控制过程的prod;而修改表中的记录则不需要任何这个的)
我的数据建模者只想使用描述.他的主要论点是,它需要一个无关紧要的联盟.
应该采用哪种方式?如果应该完成代码/描述方式,我该如何说服数据建模者?
谢谢!
type_cd type_dsc
CN Contractor
IN Inspector
Run Code Online (Sandbox Code Playgroud)
Rob*_*ijk 11
总结所有答案,我认为查找表有四种选择:
备选方案1:
•说明(主键,较长的varchar2列)
备选方案2:
•代码(主键,短varchar2列)
•描述(非空,更长的varchar2列)
备选方案3:
•Id(无意义的主键,从序列派生的整数值)
•描述(非空,更长的varchar2列)
备选方案4:
•Id(无意义的主键,从序列派生的整数值)
•代码(唯一键,短varchar2列)
•描述(非空,更长的varchar2列)
主键列将位于主表中,顶部有外键约束.
每种选择的一些特征:
备选方案1:
•查询主表时不需要连接
•在主表上进行临时查询时清除含义•主表
需要更多存储
• 主表上的索引将比其他备选方案更大
•更新描述值意味着维护问题和应用程序停机时间.
备选方案2:
•如果要检索描述值
,则需要加入•如果要过滤某些查找值,则不需要加入:您可以使用代码值.
•在主表上进行临时查询时非常清楚意义
• 主表的最小额外存储要求
• 主表上的索引将很小.
•更新描述值很容易,但代码通常是描述的缩写.更新描述值时,代码可能会变得混乱.
备选方案3:
•要检索描述值时需要加入
•对某些查找值进行过滤时,您必须在查询中使用"描述"值,因为"标识符"无意义.
•在主表上进行临时查询时,含义不明确
• 主表的最小附加存储要求
• 主表上的索引将很小.
•更新描述值很容易,并且不会像代码值那样引起混淆
备选方案4:
•要检索描述值
时需要加入•在对某些查找值进行过滤时需要加入,您可以在查找表中使用"代码"值.
•在主表上进行临时查询时含义不明确
• 主表的最小附加存储要求
• 主表上的索引将很小
•更新描述值很容易,您也可以非常轻松地更新代码值以及使其类似于描述值.但是,在执行此操作时,您可能不得不重新访问一些代码.
个人意见:
我会看看我打算如何使用主表和查找表.哪些查询很重要,必须高效运行?这些价值会改变吗?
我个人的选择是替代2或4.如果我绝对确定代码值永远不会改变,我会使用替代2.这很少见.国家代码更改,社会安全号码更改.货币代码改变,等等.所以,在大多数情况下,我会选择替代4.我不会太担心额外的连接,特别是因为查找表是一个小表.
但是:选择一个符合您要求的替代品.
当您了解替代方案的更多特征时,请随时编辑文本.
问候,
Rob.
代码/说明.该代码值(我假设)将是一个更小,更有效的整数.此外,您不希望出现需要更新所有外键的情况,因为文本描述在将来的某个时间会发生变化.
编辑:根据您刚添加的示例代码,我建议您将代码值设置为整数值,而不是像"CN","IN"这样的字符串.您希望您的键值与描述相关的任何"含义"无关.'CN'仍然暗示 '承包商',如果/当该描述变为'外部资源',那么'CN'将会产生误导.