关系数据库 - 必须更正确吗?

时间:2009-04-15 11:20:53

标签: storage database

我非常喜欢数据库设计以及语义管理数据的整个概念以及随之而来的所有逻辑。

然而,我对数据库的知识水平(我猜)是非常基础的 - 我可以使用ER图,连接表,处理多对多,一对多等来正确建模数据关系。 我在编程方面经验丰富,我认为我的数据库知识就像了解面向对象编程的基础知识,即如何建模汽车类,继承车辆类,包含车轮对象等等。

现在我想进一步了解关系数据库,以便我可以自信地向雇主说我可以在专业水平上处理这个问题。

我现在所能处理的可能就是我个人网站后端的电影数据库,如果我是亚马逊并且不得不存储数百万部电影,这可能会崩溃。那么可扩展性的主题是什么?我确信在数据库设计中有一个非常“标准”的主题/概念阵列,如果你打算在专业水平上使用数据库,你必须理解并能够在现实生活中应用。

所以,如果该领域的任何数据库专家可以命名某些领域,概念,案例研究或任何有利于学习以获得真正擅长数据库的东西,我将非常感激。我相信这里潜藏着巨大的科学,我想要它。

提前致谢!

19 个答案:

答案 0 :(得分:9)

该领域的标准文本是C.J.Date的“数据库系统简介”。

我有二十年的C经验;我读了它,认为它很好,我写了一个关系数据库因为它(一个合适的,不是这个SQL malarky!)。

答案 1 :(得分:4)

另一个领域是维度建模和数据仓库。

我多年来一直在使用关系建模,然后我阅读The Data Warehouse Toolkit并获得了如何使用它的全新视图。

答案 2 :(得分:3)

如果他的Database In Depth: Relational Theory for Practitioners对你来说不够肮脏,可以从C. J. Date An Introduction to Database Systems获得更多污垢。

说真的,这两本书比其他许多专业数据库工作者所拥有的,能够在更少的空间内为您提供有关RDBMS的更多知识。特别是,Depth中的数据库着眼于即使在语言不支持时如何关联地考虑数据库,以及如何将SQL变成一种接近关系的语言。

答案 3 :(得分:3)

我会自愿列出您可能要考虑作为数据库编程方面的一系列领域。我不会声称您需要在所有这些方面,甚至大多数方面都是专家,以便能够使用DBMS进行编程,甚至无法编写DBMS。但是,它们都是在某些时候具有某种相关性的主题 - 没有特别的顺序:

  • 查询语言设计
  • 查询优化
  • 查询重写
  • 数据类型
  • 存储组织
  • 交易管理
  • 通讯协议
  • 加密
  • 身份验证和身份识别
  • 架构设计
  • 复制
  • 备份和恢复
  • 两阶段提交
  • 乐观并发控制
  • 锁定和悲观并发控制
  • 授权
  • 基于标签的访问控制
  • 设定理论
  • 关系理论
  • 分布式查询
  • 布尔逻辑
  • 用户定义的类型和功能
  • 目录管理
  • 缓冲管理
  • 排序
  • 国际化(I18N),本地化(L10N),全球化(G11N)
  • 量词
  • 审计
  • 触发器
  • 存储过程

我也没有声称完整性或极简性。

答案 4 :(得分:2)

我认为set +关系代数是大多数数据库用户都知之甚少的东西,但是学习起来会很好。当你理解将一个关系映射到另一个关系背后所涉及的逻辑时,你会开始更清楚地看到为什么像规范化这样的事情是好的,为什么尽可能最好地避免NULL等等。你也开始看到SQL与纯关系查询语言相比的缺陷,由于性能原因,功能对范例施加了限制等。

答案 5 :(得分:2)

只是数据库的学生我只能在我的有限范围内发言,但我可以建议两个可能有帮助的网站......

http://database-programmer.blogspot.com/2008/09/comprehensive-table-of-contents.html

这是肯尼斯唐斯的网站,他从SQL的基础知识出发,深入研究更复杂的主题。毕竟,这个人围绕着DB编写了一个框架。

另一个是高可伸缩性......

http://highscalability.com/

他们进入了DB的每一个领域。

希望这有帮助。

答案 6 :(得分:1)

总而言之,设计示例总是很好......看看是否有人知道谁需要数据库。但是,根据您感兴趣的行业,研究VLDB(超大型数据库)技术可能会很有用。

答案 7 :(得分:1)

在我看来,有三个具有数据库技能的“轨道”:开发人员,DBA和架构师。从开发的角度来看,您希望专注于开发,了解架构师并在此过程中获取尽可能多的DBA内容。

作为开发人员,关键是(在我看来)将使您的SQL达到一个非常好的标准。作为面试官,如果我正在寻找开发人员,我不在乎你是否可以像编写查询一样设计数据库。假设您了解基本的CRUD命令,您知道吗:

存储过程(不仅仅是如何使用它们,而是何时以及为何使用)
观点(同上,包括物化观点)
触发(插入,更新,删除,方式和原因)
游标(特别是对性能的影响)
参照完整性
交易
指数
向表添加默认值,约束和标识
复杂使用分组和有 特别是功能:
  - 日期和时间操纵
  - 字符串操作
  - 处理空值

您应该能够仅使用SQL从数据库中提取所需的任何数据,您永远不需要使用过程代码以任何方式操作或解析它(您可以选择,但它将是一个选择而不是您不知道怎么用SQL做。)

作为开发人员,我所看到的一个预订是Joe Celko的SQL for Smarties。有很多SQL可以做你可能从未真正考虑过在SQL中做的事情。

学习这些东西的最好方法之一就是编写报告(管理信息),这看起来很乏味。我看到很多人都抱怨写报告很乏味,然后真的非常非常糟糕(而且不仅仅是因为他们没有尝试)。报告往往接近纯SQL,因此您必须真正了解手头的工具,而复杂的报告确实会让那些不了解SQL的人暴露出来。人们也往往不想等待太长时间,所以表现也是关键。

查看您当前的数据库,并提出一些人们可能真正想知道的非常尴尬的事情。认为营销,趋势,最受欢迎和最不受欢迎。然后尝试将一堆它们组合成一个查询。

在性能方面,我还试图深入了解查询优化器的工作原理,如何决定何时使用索引以及何时进行表扫描,何时索引有用以及什么时候会阻碍。< / p>

优秀的开发人员不只是编写好的查询,而是编写快速,可维护的查询。要真正掌握这一点,您需要使用包含十几个(或更多表)的数据库,理想情况下,数百万行。就在你开始看到你认为很好的追问的时候。

建筑师/设计师的其他人已经很好地介绍了。关于这个问题,我要说的是,对于每个必须设计的数据库,都需要为它编写数百个查询。当你提升技能时,你可能想要考虑比例分解工作,并确保你的查询真的达到了最佳状态。

就链接而言,它取决于平台 - 所有这些都倾向于特定于平台。但那就是谷歌的用途。

不是我完全怀疑你想要什么,但是很多人认为他们知道SQL真的不是......

答案 8 :(得分:1)

不要忘记在数据库中表示层次结构和/或图形。它可能是一种痛苦&amp;没有正确答案。

这些SO帖子中提到了标准技术(至少用于层次结构):

编辑:还有用于GIS的spatial database个应用程序,您可以使用R-trees等基于点位置获得数据结构和/或索引。使用它们与常规的非空间数据库功能略有不同。

答案 9 :(得分:1)

免责声明:不是数据库设计专家。

某些性能问题可以通过以下方式处理:

  1. 对数据库进行非规范化,以减少要加入的表的数量
  2. 添加索引
  3. 应该进行过滤,以便首先删除最大的非匹配数据,然后在简化集上选择下一个条件。从100个值开始 - >&gt; 10个匹配的第一个条件 - &gt; 1个匹配第一和第二条件而不是100个值 - &gt; 80匹配第二条件 - &gt; 1匹配第一和第二条件。看似微不足道,但重要的是要记住。
  4. 划分 et impera 是可扩展性的座右铭。如果你有一些以非线性方式扩展的东西,比如O(N ^ 2),那么保持N尽可能低是有意义的,你应该将你的数据集分成更小的集合,假设它们是独立的,你可以解决分区问题。一个例子是分片,通常用于将用户数据库保存在大型社交网站中。 (注意:一个例子,我不会这样实现)不是拥有一个包含所有用户的庞大数据库,而是拥有26个服务器(每个字母的一个字母),然后他们将所有昵称放在相同的第一个字母在同一台服务器上。这具有以下优点:

    一个。你平衡不同机器上的负载
      湾如果一台计算机崩溃,您只能让用户的一部分用户无法访问该网站,而不是全部用户   C。您使用高度辨别的标准(第一个字母)预选搜索,然后执行第二次搜索(用户名)
      d。减少每个数据库的条目数。

答案 10 :(得分:1)

这取决于您要对数据库执行的操作,数据的外观,工作流程,您需要使用的服务器,客户端和数据库的数量......

所以让我们假装你像我一样,必须处理几个数据库,而不是大数据库(每个<100 GB),并且你有许多客户有很多不同的需求,可以让你开发很多自定义解决方案,比如生成自定义报告或出口。这让你更像是程序员而不是DBA。在表现之前,你需要的是生产力。

在这种情况下,我提出的最佳解决方案是尽可能地摆脱SQL。 您可以通过使用某种ORM(自制或现有ORM)来实现这一目标,从而为对象编程交换SQL脚本。 这样做我会在几分钟内完成SQL所需的时间。

答案 11 :(得分:1)

答案 12 :(得分:1)

一个非常常见的情况是必须将丑陋的数据库映射到实体模型,而实体模型不必直接反映在数据库的结构中。找出哪种方式最适合对您域中的数据进行建模可能会非常棘手。

全文搜索和XML似乎越来越多。

我没有使用它的经验,但我知道DB2(其中有试用版)有一些疯狂的新功能)

玩得开心: - )

答案 13 :(得分:1)

我认为现有数据库的优化可能会让人感兴趣。即为什么要对表进行非规范化。

一些基本的关系代数是有用的知识,与集合论密切相关。

答案 14 :(得分:0)

我建议稍微缩小你的范围。选择一个sql server并成为它的专家...例如获取mysql,了解存储类型,复制类型等之间的差异,以几种不同的方式实现复制。获取大型数据集并尝试优化查询。做一些支点并优化你的指数。调查备份策略。了解如何在每天持续添加100,000个事务的10gb数据库时提高复制和备份的性能。编写软件以插入记录和脚本以进行复制和备份。

当你试图覆盖所有sql服务器时,很难成为一个没有实际经验的有效dba。只关注一个...我建议使用mysql或mssql,但不管你的船是什么。

-don

答案 15 :(得分:0)

我强烈建议您从www.dbdebunk.com开始。它在反对理论方面有很多实际的东西。该网站有点过时,但仍然有用。如果你真的想成为数据库专业人士,即使商业内容也不算太贵。

答案 16 :(得分:0)

我所知道的关系数据库模式的概念建模只有一种严格的技术(我花了很多时间看)。它被混淆地命名为“对象 - 角色建模”。这里有几个参考文献。

http://www.agilemodeling.com/artifacts/ormDiagram.htm

http://www.tdan.com/view-articles/5033

http://en.wikipedia.org/wiki/Object_role_modeling

http://en.wikipedia.org/wiki/NORMA

这是一个plugin for Visual Studio

答案 17 :(得分:0)

嗯,坦率地说,数据库只是一种存储和访问数据的方式。 几乎是文件系统的功能。

来自LDAP的并行是它是一个协议,并且这不是你可以用它做什么以及它应该如何实现的定义,关于SQL也是如此。

因此,如果您想了解有关数据库的更多信息,您实际上是想要了解有关SQL协议和/或如何存储和获取数据的更多信息。

您可能有兴趣搜索'B-Tree'是什么以及如何使用它。 值得一提的另一件事是EAV(实体 - 属性 - 价值)以及为什么架构对它如此重要。

凭借这些知识,您实际上可以在自己的数据库中扮演角色,同时欣赏RDBM已经为您做过的事情。

如果您想要更实用的方法,请查看开源PostgreSQL提供的文档,可能从this开始。

答案 18 :(得分:0)

您可以先阅读其中一篇(几乎是最近的)重点关注数据库基础和趋势的评论文章:The anatomy of databases