- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我在 Orable 数据库上工作,我正在添加几个查找表。
一般的问题是查找表应该包含代码和描述,代码是返回主表的 FK,还是查找表应该只包含描述,是返回主表的 FK。
我支持代码/描述对。我觉得如果我有 type = Contractor
和 code = CN
存储过程应该说 where type='CN'
而不是只有type=Contractor
并且没有代码并在存储过程中这样说:where type='Contractor'
因为如果我想显示怎么办:General Contractor
给用户而不是 Contractor
。然后我将不得不更改存储过程。我觉得我不应该这样做。 (更改存储过程需要在开发中重新编译,迁移到测试,由客户重新测试,并迁移需要经过更改控制过程的产品,该过程涉及两周的等待期;而修改表中的记录不需要任何这个)
我的数据建模师只想使用描述。他的主要论点是它需要一个不必要的连接。
应该怎样做?如果应该以代码/描述的方式完成,我该如何说服数据建模者?
谢谢!
type_cd type_dsc
CN Contractor
IN Inspector
最佳答案
总结所有答案,我认为查找表有四种选择:
备选方案 1:
• 描述(主键,较长的 varchar2 列)
备选方案 2:
• 代码(主键,一个短的varchar2列)
• 说明(不为空,更长的 varchar2 列)
备选方案 3:
• Id(一个无意义的主键,一个序列派生的整数值)
• 说明(不为空,更长的 varchar2 列)
备选方案 4:
• Id(一个无意义的主键,一个序列派生的整数值)
• 代码(唯一键,一个短的 varchar2 列)
• 说明(不为空,更长的 varchar2 列)
主键列将位于主表中,顶部有外键约束。
每个备选方案的一些特征:
备选方案 1:
• 查询主表时不需要join
• 对主表进行临时查询时意义明确
• 主表需要更多存储空间
• 主表上的索引将比其他替代方案中的索引大得多
• 更新描述值意味着维护麻烦和可能的应用程序停机。
备选方案 2:
• 获取描述值时需要加入
• 如果您想过滤某些查找值,则不需要加入:您可以为此使用代码值。
• 对主表进行临时查询时含义非常明确
• 主表的额外存储要求最低
• 主表上的索引会很小。
• 更新描述值很容易,但是代码通常是描述的缩写。更新描述值时,代码可能会变得困惑。
备选方案 3:
• 获取描述值时需要加入
• 过滤某些查找值时,您必须在查询中使用描述值,因为 ID 没有意义。
• 对主表进行临时查询时含义不明确
• 主表的额外存储要求最低
• 主表上的索引会很小。
• 更新描述值很容易,不会像代码值那样引起混淆
备选方案 4:
• 获取描述值时需要加入
• 过滤某些查找值时需要连接,您将使用查找表中的代码值。
• 对主表进行临时查询时含义不明确
• 主表的额外存储要求最低
• 主表上的索引会很小
• 更新描述值很容易,您也可以非常轻松地更新代码值,使其类似于描述值。不过,您可能需要在执行此操作时重新访问一些代码。
个人观点:
我会看看我打算如何使用主表和查找表。哪些查询很重要并且必须高效运行?值(value)观会改变吗?
我个人的选择是备选方案 2 或 4。如果我绝对确定代码值永远不会更改,我会使用备选方案 2。而这很少见。国家代码改变,社会安全号码改变。货币代码更改等。所以,大多数时候,我会选择备选方案 4。我不太关心额外的连接,尤其是因为查找表是一个小表。
但是:选择适合您要求的备选方案。
当您了解替代方案的更多特征时,请随时编辑文本。
问候,
罗布。
关于sql - 我应该在查找表中使用代码吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4946252/
SQL、PL-SQL 和 T-SQL 之间有什么区别? 谁能解释一下这三者之间的区别,并提供每一个的相关使用场景? 最佳答案 SQL 是一种对集合进行操作的查询语言。 它或多或少是标准化的,几乎所有关
这个问题已经有答案了: What is the difference between SQL, PL-SQL and T-SQL? (6 个回答) 已关闭 9 年前。 我对 SQL 的了解足以完成我的
我在数据库中有一个 USER 表。该表有一个 RegistrationDate 列,该列有一个默认约束为 GETDATE()。 使用 LINQ 时,我没有为 RegistrationDate 列提供任
我有一个可能属于以下类型的字符串 string expected result 15-th-rp 15 15/12-rp 12 15-12-th
很难说出这里问的是什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或言辞激烈,无法以目前的形式合理回答。如需帮助澄清此问题以便可以重新打开,visit the help center . 9年前关闭
我有一个存储过程(称为 sprocGetArticles),它从文章表中返回文章列表。这个存储过程没有任何参数。 用户可以对每篇文章发表评论,我将这些评论存储在由文章 ID 链接的评论表中。 有什么方
我目前正在做一个 *cough*Oracle*cough* 数据库主题。讲师介绍embedded SQL作为让其他语言(例如 C、C++)与(Oracle)数据库交互的方式。 我自己做了一些数据库工作
SQL Server 中 SQL 语句的最大长度是多少?这个长度是否取决于 SQL Server 的版本? 例如,在 DECLARE @SQLStatement NVARCHAR(MAX) = N'S
这个问题已经有答案了: Simple way to transpose columns and rows in SQL? (9 个回答) 已关闭 8 年前。 CallType
预先感谢您对此提供的任何帮助。 假设我有一个查询,可以比较跨年的数据,从某个任意年份开始,永无止境(进入 future ),每年同一时期直到最后一个完整的月份(其特点是一月数据永远不会显示至 2 月
我在数据库中有一个 USER 表。该表有一个 RegistrationDate 列,该列的默认约束为 GETDATE()。 使用 LINQ 时,我没有为 RegistrationDate 列提供任何数
下面是我试图用来检查存储过程是否不存在然后创建过程的 sql。它会抛出一个错误:Incorrect syntax near the keyword 'PROCEDURE' IF NOT EXISTS
我有一个同事声称动态 SQL 在许多情况下比静态 SQL 执行得更快,所以我经常看到 DSQL 到处都是。除了明显的缺点,比如在运行之前无法检测到错误并且更难阅读,这是否准确?当我问他为什么一直使用
来自 lobodava 的动态 SQL 查询是: declare @sql nvarchar(4000) = N';with cteColumnts (ORDINAL_POSITION, CO
使用 SQL Server 中的存储过程执行动态 SQL 命令的现实优点和缺点是什么 EXEC (@SQL) 对比 EXEC SP_EXECUTESQL @SQL ? 最佳答案 sp_executes
我有这个有效的 SQL 查询: select sum(dbos.Points) as Points, dboseasons.Year from dbo.StatLines dbos i
我正在调试一些构建成功运行的 SQL 命令的代码。 然而,在查询结束时,查询结果似乎被写入了一个文本文件。 完整的查询如下 echo SELECT DATE,DATETABLE,DATE,APPDAT
我有一些创建表的 .sql 文件(MS SQL 数据库): 表_1.sql: IF OBJECT_ID (N'my_schema.table1', N'U') IS NOT NULL DROP TAB
我写了下面的 SQL 存储过程,它一直给我错误@pid = SELECT MAX(... 整个过程是: Alter PROCEDURE insert_partyco @pname varchar(20
我在 SQL Server 2005 中有包含两列 Fruit 和 Color 的表,如下所示 Fruit Colour Apple Red Orange
我是一名优秀的程序员,十分优秀!