【问题标题】:What do I need to know about databases?关于数据库,我需要了解什么?
【发布时间】:2011-01-13 21:41:04
【问题描述】:

总的来说,我认为我在编程语言编码方面做得很好,但我认为在数据库方面我错过了一些重要的东西。

我看到招聘广告要求了解 MySQL、MSSQL、Oracle 等,但我不知道会有什么不同。

您知道,就像许多新程序员一样,我倾向于将我的数据库视为数据的垃圾场。我所做的大部分工作都归结为相对简单的 SQL(INSERT this、SELECT that、DELETE this_other_thing),这主要与我正在使用的引擎无关(当然,除了少数例外,主要是对语法的细微调整)。

有人能解释一下特定平台发挥作用的数据库的一些常见用例吗?

我确信存储过程之类的东西很重要,但是 (a) 这些大多是用特定语言(T-SQL 等)编写的,这与特定 RDBMS 本身的招聘广告要求不同,并且(b) 我从各种渠道听说存储过程即将淘汰,而且在很多情况下,无论如何现在都不应该使用它们。我相信 Jeff Atwood 是这个阵营的成员。

谢谢。


上述概念对于 MySQL、SQL Server、Oracle 等来说差别不大。

有了这个问题,我主要是想确定它们之间的重要区别。 IE。当大多数常见用例在 RDBMS 平台上相对稳定时,为什么招聘广告需要 n 年 MySQL 经验。

CRUD 语句、连接、索引……所有这些在特定引擎的范围内都相对简单。如果您了解不同的 RDBMS,这些概念很容易转移。

我正在寻找的是会导致雇主指定特定引擎而不是“使用通用数据库引擎的经验”的细节。

【问题讨论】:

  • 您首先需要了解的关于数据库的想法是它们不是“数据垃圾场”。您以这种方式处理数据库,您的应用程序将看起来像垃圾场。
  • @Randy - 明白了。这个问题的核心是要纠正这个假设。 IE。我应该如何使用这些数据库,不同引擎之间的障碍在哪里真正发挥作用。
  • 除了我在下面的评论之外 - 我认为招聘广告要求特定数据库的原因更加平庸;招聘公司在内部使用特定供应商,理想的候选人将具有该系统的经验,以减少培训/加速时间。

标签: database database-design


【解决方案1】:

数据库是事实断言的编码集合。 表的逻辑结构对应于那些“事实断言”的句法结构。 该规范化理论通过最小化冗余来帮助您找到数据库的最佳逻辑结构,即最小化所述事实断言中发生矛盾的可能性。 数据库约束实际上只不过是业务规则,以正式的方式并根据数据库的组件来表达。 实际上,所有业务规则都可以表示为数据库约束。 因此,DBMS 可以强制执行您可以想象的任何业务规则。 逻辑设计和物理设计之间有一个非常重要的区别。 SQL 和 SQL 系统在支持开发人员认识到这一重要区别方面并没有真正的帮助(说得委婉些)。 SQL 和 SQL 系统在它们对数据库约束的支持方面明显不足(而且说得委婉些)。 后两个示例很好地说明了模型(Codd 的 RM)与其实现(某些特定的 SQL 系统)之间差异的重要性。就关系数据库技术而言,后者与前者的偏差越来越大。

还有什么我忘了。

【讨论】:

    【解决方案2】:

    OraclemysqlSQL Server 中,即使是像自动递增主键这样简单的东西也可能有很大不同。

    其他一些重要的区别:

    • SQL Server 区分了聚簇键和主键;其他数据库没有。这种选择会对性能产生重大影响。

    • SQL Server 允许使用SET @Total = Total = @Total + Amount 语法来快速计算诸如运行总计之类的东西。 mysql 允许您以类似的方式使用用户变量(我认为)。在其他数据库中,您可能必须使用相关子查询。性能上的巨大差异。

    • SQL Server 可以使用newsequentialid 生成“顺序 GUID”。我不确定还有哪些其他数据库具有此功能,但与上述两点一样,使用传统 GUID 而非顺序或梳状对性能有重大影响。

    • Oracle 的CONNECT BY 是一种非常有用且非常独特的语法。 SQL Server 和 mysql 中的公用表表达式相似但不完全相同。

    • 对排名/排序函数的支持在不同的数据库中差异很大。我经常在这里发布答案,调用ROW_NUMBER。没有它,很多查询都很难编写 - 但同时,滥用它会损害性能。

    • XML 支持无处不在。现在大多数数据库都对它有相当好的支持,但是每个平台的语法和语义都完全不同。

    • 日期/时间处理可能完全不同。 Oracle 有几种不同的与日期/时间相关的类型,其中一些包括时区信息。一般来说,Oracle 在管理时态数据方面比其他数据库要好得多,并且有几个特性,如果你切换的话,你会错过这些特性。直到最近,微软还没有 datetime 类型,只有 datetime,这很难规范化。

    • 不同数据库中的空间类型不同和/或不存在。 mysql 暴露了一个完整的 OpenGIS 模型;微软的支持有点基本,但仍然有能力。 Oracle 有它,但它的信息有点难找,而且它是某种可选的附加组件。我认为 DB2 已经开始获得它,但支持仍然有点参差不齐。

    • mysql 实际上允许您选择如何存储索引(即 btree 或哈希)。这也是一个重要的性能考虑因素。

    • SQL Server 允许您INCLUDE 索引中的列 - 这对性能非常重要。

    • Oracle 允许您创建基于函数的索引、位图索引等。这些可能会让您难以理解。

    • Oracle 可以在非常特殊的情况下执行“跳过搜索”,我认为其他数据库(目前)不支持这一点。这可能会影响您对索引列的排序方式。

    • SQL Server 具有 CLR 类型/函数/聚合。显然不支持任何其他数据库产品。

    • 触发器支持差异很大。 SQL Server 有AFTERINSTEAD OF。 mysql 有BEFOREAFTER。甲骨文拥有所有这些以及更多。它们的行为完全不同。

    我确信还有很多很多不同,但这至少应该让您了解为什么 5 年的 Oracle 经验完全与 5 年的 Oracle 经验完全不同。 SQL 服务器。

    【讨论】:

      【解决方案3】:

      我看到招聘广告要求了解 MySQL、MSSQL、Oracle 等,但我不知道会有什么不同。

      我就是所谓的 SQL 开发人员。当您运行工厂数据库工作 (CRUD) 时,您不会看到太多差异。但是,当您处理数据库自有品牌的 SQL 时,差异会变得非常明显。

      在标准之外谈论 SQL 时,有 4 种不同类型的命令。它们是:

      • 数据操作语言 (DML)
      • 数据定义语言 (DDL)
      • 数据控制语言 (DCL)
      • 事务控制语言 (TCL)

      最大的区别在于最后两个,DCL 和 TCL。那些有很多特定于数据库的非标准 SQL 命令。前两个,DML 和 DDL,在任何使用关系模型的数据库中都非常相似。

      大型数据库供应商也为他们的 SQL 实现起了绰号。这是一个简短的示例:

      • SQL 服务器:T-SQL
      • 甲骨文:PL-SQL
      • PostgreSQL:P-SQL 或 NG-SQL
      • 火鸟:IB-SQL
      • MySQL:mSQL

      列表还在继续,但你明白了。 Wikipedia 上有关于不同命令首字母缩写词的好文章。

      我发现大多数雇主都无法明确说明这一点,因为大多数雇主会使用非技术经理和/或 HR 来进行招聘。技术经理基本上告诉他们,新员工需要了解 X 技术。这也是因为大多数人都懒得雇用情报,而是求助于“我们有 X,所以该死,我们需要雇用了解 X 的人!”模因。对于经常使用 StackOverflow 的人来说,这些差异实际上并不难学习。我相信这里的任何人都能很快学会这些。

      【讨论】:

        【解决方案4】:

        在与热衷于数据库的同事交谈时出现的一些问题:

        • 在执行多个复杂连接时,行、页面和表锁定升级,意味着有时在不同供应商的数据库上做非常不同的事情。这就是理论真正触及停机坪的地方,而且通常是不直观的。
        • 游标在不同供应商数据库实现上的最佳使用方式之间的差异
        • 存储过程语言变体中的奇怪内容,例如如何最好地处理失败案例
        • 临时表和视图的最佳使用方式因底层实现而异。

        在您尝试解决必须解决的问题之前,所有这些事情都无关紧要 - 跑得非常快 - 包含大量数据 - 变得非常庞大和复杂(即多个查询同时访问同一个表)

        这些都是 DBA 应该提供帮助的事情,因此取决于您的目标是成为 DBA 还是程序员。以上这些都没有真正伤害到我,因为我没有在数据库密集型系统上工作过,但我已经工作过一些,而且这些系统的程序员最终对内部结构、限制和良好功能了解很多关于他们正在使用的特定数据库。

        获得此类知识的最佳方式(除了在工作中)是阅读手册或与已经知道的人一起出去问问他们。

        【讨论】:

        • 什么是“数据库密集型系统”?我的意思是,例如一个网站,即使访问量很大,也不是很密集,对吧?我之所以这么问,是因为我相信大量阅读表格似乎不如大量阅读和写作那么密集。
        【解决方案5】:

        它不仅仅是存储过程和函数。尽管 SQL 的工作方式或多或少相同,但每个数据库都有重要的基本差异和怪癖。

        例子:

        • Oracle 和 MySQL 在不同情况下处理锁定的方式不同。
        • Oracle 没有像 MySQL 和 SQL Server 这样的自动递增主键。
        • 特定于供应商的微妙行为,例如 Oracle 对 VARCHAR 进行排序的方式因区域设置而异。

        如果您真的想改进您的应用程序,您最终必须熟悉有关特定数据库如何工作的详细信息。大多数情况下它并没有太大的不同,但当它确实重要时,它通常会产生很大的不同,尤其是在性能方面。

        【讨论】:

          【解决方案6】:

          我认为关于数据库的基本知识应该是:

          上述概念在 MySQL、SQL Server、Oracle、Postgres 和 other relational database systems 之间没有太大差异。但是,您会为现在流行的 NoSQL databases 找到一组不同的概念,例如 CouchDBMongoDBSimpleDBCassandraBigtablemany others

          【讨论】:

          • "上述概念对于 MySQL、SQL Server、Oracle 等来说差别不大。" - 我试图确定它们之间的重要区别。 IE。当大多数常见用例在 RDBMS 平台上相对稳定时,为什么招聘广告需要 n 年 MySQL 经验。
          • @Junior Programmer:可能是因为它是一半数据库管理员/一半程序员的工作,尽管他们没有告诉你。
          • 我敢肯定,如果您是一位拥有 10 年经验的专家级 MySQL 开发人员,那么您会在其中一项工作中做得很好……当谈到数据库管理时,故事可能会稍微有点不同,尽管在我看来并没有那么大。
          • @JRL:这是一个不错的假设,但我到处都能看到这些要求(通常很不错,但仍然......)。我部分假设他们只是将其作为一项要求而放下,因为他们使用它,而 HR 无人机只是......好吧,无人机。
          • 我要添加到此列表中的是所有一般的良好编程实践(命名约定)和至少有关隔离级别的理论知识(之前在工作面试中被问过,本可以做得更好)。
          【解决方案7】:

          至于供应商之间的差异程度,这是因为 SQL 是一种标准 (http://en.wikipedia.org/wiki/SQL#Standardization),供应商对该标准的实现方式不同。

          这些供应商中的每一个都试图提供额外的东西来吸引人群......这就是为什么您会看到其中一个可用的功能而不是另一个可用的功能。但有时该功能会进入标准,因此它并不总是一件坏事。

          对于存储过程。我同意,因为今天的 ORM 和实践倾向于通过从数据库中删除业务逻辑并将其视为“仅”一个存储库来实现更大的关注点分离。

          我的 2 美分

          【讨论】:

            【解决方案8】:

            不要忘记关系模式、主键和外键以及它们之间的关系。从 DB 开始,我会使用 MySql 和 MSSQL,因为它们是市场上最常见的。我把Oracle当作更高级、更复杂的数据库

            【讨论】:

              【解决方案9】:

              CRUD 语句之后,要成为一名高效的数据库程序员,我认为需要理解的一些最重要的事情是JOIN 语句。了解LEFTRIGHTOUTERINNER 连接之间的区别,并知道何时使用它们。最重要的是,知道数据库在执行JOIN 时实际在构建什么。

              对我来说,Wikipedia article 非常有帮助。

              此外,索引非常重要——这就是关系数据库执行快速查询的方式。了解如何使用它们以及幕后发生的事情。

              Wikipedia article on DB indexing.

              您还应该知道如何构建多对一关系(使用foreign keys)和多对多关系(使用join tables)。

              我知道在您的问题中您询问的是具体的数据库实现,但如果您按字面意思理解并且您只知道SELECTINSERTUPDATEDELETE,那么上述概念将比学习特定实现的复杂性更有价值。

              【讨论】:

              • 我想说首先要知道的是范式。如果你一开始就有一个糟糕的结构来处理,那就很难了。这只是对您的回答的补充,而不是不赞成;)
              • 但这在所有数据库中都是一样的,对吧?我的意思是,它回答了问题的 OP 标题,但问题本身要求差异......
              猜你喜欢
              • 2011-04-12
              • 1970-01-01
              • 2011-04-15
              • 1970-01-01
              • 2010-12-26
              • 2016-02-14
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多