关于数据库,我需要了解什么?

时间:2010-02-06 16:45:45

标签: database database-design

总的来说,我认为在编程语言编写方面我没用,但我认为在数据库方面我缺少一些东西。

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

你看,像许多新程序员一样,我倾向于将我的数据库视为数据的倾销场。我做的大部分归结为相对简单的SQL(INSERT this,SELECT that,DELETE this_other_thing),它主要独立于我正在使用的引擎(除了少数例外,当然,大多是语法的小调整)。

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

我确信存储过程之类的东西很重要,但是(a)这些大多是用特定语言(T-SQL等)编写的,这与特定的RDBMS本身不同,并且和(b)我从各种渠道获悉,存储过程正在逐渐消失,而且在很多情况下,它们现在都不应该被使用。我相信杰夫阿特伍德是这个阵营的成员。

感谢。


  

上述概念对于MySQL,SQL Server,Oracle等没有多大影响。

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

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

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

9 个答案:

答案 0 :(得分:4)

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

以上概念在MySQL,SQL Server,Oracle,Postgres和other relational database systems之间没有太大差异。不过,您会为现在流行的NoSQL databases找到一组不同的概念,例如CouchDBMongoDBSimpleDBCassandra,{{3 }和Bigtable

答案 1 :(得分:3)

CRUD语句之后,作为一名有效的DB程序员,我认为一些最重要的事情需要理解JOIN语句。了解LEFTRIGHTOUTERINNER联接之间的区别,并了解何时使用每个联接。最重要的是,知道数据库执行JOIN时实际构建的内容。

对我来说,Wikipedia article非常有用。

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

Wikipedia article on DB indexing

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

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

答案 2 :(得分:1)

这不仅仅是存储过程和函数。每个数据库都有基本的差异和怪癖,即使SQL的工作方式大致相同,也很重要。

示例:

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

如果您真的想要改进应用程序,最终必须熟悉特定数据库的工作方式。大多数时候它并没有太大的区别,但是当它确实很重要时,它通常会产生很大的不同,特别是在性能方面。

答案 3 :(得分:1)

与我的数据库热心的同事交谈时似乎出现了一些事情:

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

在你试图解决任何必须要做的事情之前,所有这些事情并不重要  - 跑得非常快   - 包含大量数据   - 变得非常庞大和复杂(即多个查询同时命中同一个表)

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

获得这样的知识(除了工作之外)的最佳方式是阅读手册或与已经了解并向他们询问相关知识的人闲逛。

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

这些供应商中的每一个都试图提供额外的东西让人群聚集在一起......这就是为什么你看到一个而不是另一个可用的功能。但有时候这个功能会进入标准,所以它并不总是坏事。

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

我的2美分

答案 6 :(得分:0)

  

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

我就是所谓的SQL Developer。在进行磨机数据库工作(CRUD)时,您不会看到太多差异。但是,当您处理数据库自有品牌的SQL时,差异会变得非常明显。

当谈论标准之外的SQL时,有4种不同类型的命令。这些是:

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

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

更大的数据库供应商也昵称他们的SQL实现。这是一个简短的样本:

  • SQL Server:T-SQL
  • Oracle:PL-SQL
  • PostgreSQL:P-SQL或NG-SQL
  • Firebird:IB-SQL
  • MySQL:mSQL

列表继续,但你明白了。维基百科有关于不同命令首字母缩略词的好文章。

我发现大多数雇主都无法明确表达这一点,因为大多数雇主都会使用非技术经理和/或人力资源来招聘。技术经理基本上告诉他们,新员工需要了解X技术。这也是因为大多数人都懒得雇用智力,而是他们又回到了“我们有X,所以这么做,我们需要雇用一个知道X的人!”米姆。对于频繁使用StackOverflow的人来说,差异实际上并不难。我相信这里的任何人都可以相当快地学习这些。

答案 7 :(得分:0)

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或hash)。这也是一个重要的性能考虑因素。

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

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

  • Oracle可以在非常具体的情况下执行“跳过搜索”,这是我认为在其他数据库中尚未支持的东西。这可能会影响您对索引列的排序方式。

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

  • 触发支持差异很大。 SQL Server有AFTERINSTEAD OF。 mysql有BEFOREAFTER。 Oracle拥有所有这些以及更多。这些都表现得完全不同。

我确信存在很多很多差异,但这应该至少可以让您了解为什么5年的Oracle经验与<5年完全不同于5年的经验SQL Server。

答案 8 :(得分:0)

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

还有我忘记记住的其他事情。