查找表有多重要?

BDu*_*elz 22 mysql sql database-design

我编写的很多应用程序都使用了查找表,因为这就是我教授的方式(规范化等).问题是由于这个原因,我所做的查询通常更复杂.它们通常看起来像这样

获取所有仍处于打开状态的帖子

"SELECT * FROM posts WHERE status_id = (SELECT id FROM statuses WHERE name = 'open')"
Run Code Online (Sandbox Code Playgroud)

通常,查找表本身非常短.例如,可能只有3种左右的不同状态.在这种情况下,是否可以通过在应用程序中使用常量来搜索某种类型?就像是

获取所有仍处于打开状态的帖子

"SELECT * FROM posts WHERE status_id = ".Status::OPEN
Run Code Online (Sandbox Code Playgroud)

或者,如果不是使用外来ID,我将其设置为枚举并查询它?

谢谢.

Per*_*DBA 31

如果您仅限于MyNonSQL中的小型文件系统,或者您正在考虑SQL和大型数据库,那么答案有所不同.

在真正的数据库中,有许多应用程序使用一个数据库,许多用户使用不同的报告工具(不仅仅是应用程序)来访问数据,标准,规范化和开放式体系结构要求非常重要.

尽管有人试图改变"正常化"等的定义以适应目的,但规范化并没有改变.

  • 如果在数据表中重复"打开"和"关闭",则这是一个简单的标准化错误.如果更改这些值,则可能需要更新数百万行,这是非常有限的设计.这些值通常归一化为Reference或Lookup表.它还节省了空间."打开","关闭"等值不再重复.

  • 第二点是易于更改,如果"已关闭"更改为"已过期",则需要更改一行,这将反映在整个数据库中; 而在非标准化文件中,需要更改数百万行.

  • 添加新值只需插入一行即可.

  • 在Open Architecture术语中,Lookup表是一个普通的表.它存在于(标准SQL)目录中; 任何报表工具都可以找到它,只要定义了PK :: FK关系,报表工具也可以找到它.

  • 枚举仅适用于非SQLS.在SQL中,Enum是一个Lookup表.

  • 下一点涉及密钥的意义.如果密钥对用户毫无意义,那么使用INT或TINYINT或任何合适的东西; 逐渐编号; 允许"差距".但是如果密钥对用户有意义,请不要使用无意义的数字,请使用有意义的密钥.男女"M"和"F"等

    • 现在有些人会进入切线,重新获得PK的持久性.这是一个单独的观点.是的,当然,总是使用稳定的PK值."M"和"F"不太可能改变; 如果您使用过{0,1,2,4,5,6},请不要更改它,为什么要这样做.那些价值观被认为是没有意义的,只有有意义的Key需要改变.
      .
  • 如果您确实使用了有意义的密钥,请使用简短的字母代码,用户和开发人员都可以轻松理解(并从中推断出长篇描述).

  • 由于PK是稳定的,特别是在查找表中,您可以安全地编码:

    WHERE status_id = 'O'

    您不必加入Lookup表并检查值"Open".这会丢失代码段中Lookup表的值.

SQL是一种繁琐的语言,尤其是在连接时.但这就是我们所拥有的,所以我们需要接受障碍并处理它.你的示例代码很好.但更简单的形式可以做同样的事情.报告工具将生成:

SELECT  p.*,
         s.name
    FROM posts p, 
         status s
    WHERE p.status_id = s.status_id 
    AND   p.status_id = 'O'
Run Code Online (Sandbox Code Playgroud)

  • For banking systems, where we use short codes which are meaningful (since they are meaningful, we do not change them with the seasons, we just add to them), given a Lookup table such as (carefully chosen, similar to ISO Country Codes):

    Eq   Equity
    EqCS Equity/Common Share
    O    Over The Counter
    OF   OTC/Future
    Run Code Online (Sandbox Code Playgroud)

    Code such as this is common:

    WHERE InstrumentTypeCode LIKE "Eq%"

    并且用户将从显示"打开","已关闭"等的下拉列表中选择值,而不是{0,1,2,4,5,6},而不是{M,F,U}.在应用程序和报表工具中都有.如果没有查找表,则无法执行此操作.

    最后,如果数据库很大,并支持BI或DSS或OLAP函数(高度规范化的数据库),那么Lookup表实际上是Dimension-Fact分析中的Dimension或Vector.如果不存在,那么在安装此类分析之前,必须添加它以满足该软件的要求.

    • 很高兴知道我有这样热心的粉丝! (2认同)
    • 谢谢.至少我们*有*科学老师.这些天有很多从事技术工作,从未有过教师; 他们随时学习.他们没有更高的权威,他们被任何与他们实施的东西不同的东西吓坏了,并与科学争论.你提问的时候要小心. (2认同)
    • @PerformanceDBA - 也许您有如此热心的追随者,因为我们中的一些人缺乏您所支持的 CS 教育的好处,正在尽我们所能来获得我们所能做的!;-) 对我来说,回学校不是一种选择,这对我来说本质上是一种爱好。我一直在寻求像您这样的人提供的反馈类型。如今,获取不良信息太容易了。虽然我很高兴编程工具对“我们其他人”来说变得更容易使用了,但我也很高兴有人愿意让我们劫持你的研究生学位!谢谢 。. . (2认同)