【发布时间】:2010-09-27 12:03:40
【问题描述】:
您知道学习如何设计 SQL 解决方案的好资源吗?
除了基本的语言语法之外,我正在寻找一些可以帮助我理解的东西:
- 要构建哪些表以及如何链接它们
- 如何针对不同规模进行设计(小客户端APP到大型分布式网站)
- 如何编写有效/高效/优雅的 SQL 查询
【问题讨论】:
标签: sql database database-design scalability
您知道学习如何设计 SQL 解决方案的好资源吗?
除了基本的语言语法之外,我正在寻找一些可以帮助我理解的东西:
【问题讨论】:
标签: sql database database-design scalability
我从这本书开始:Jan L. Harrington 的Relational Database Design Clearly Explained (The Morgan Kaufmann Series in Data Management Systems) (Paperback),发现它非常清晰且很有帮助
当你加快速度时,这个也很好Database Systems: A Practical Approach to Design, Implementation and Management (International Computer Science Series)(平装本)
我认为 SQL 和数据库设计是不同的(但互补的)技能。
【讨论】:
我从这篇文章开始
http://en.tekstenuitleg.net/articles/software/database-design-tutorial/intro.html
与阅读整本书相比,它非常简洁,并且很好地解释了数据库设计的基础知识(规范化、关系类型)。
【讨论】:
经验很重要,但在表设计方面,您可以从 Hibernate 和 Grails 等 ORM 的运行方式中学到很多东西,了解它们为什么这样做。另外:
将不同类型的数据分开 - 不要将地址存储在您的订单表中,例如,链接到单独的地址表中的地址。
我个人喜欢在作为主键的每个表(保存数据,而不是将不同表链接在一起的那些,例如 m:n 关系)上使用整数或长代理键。
我还喜欢创建和修改时间戳列。
确保在任何查询中执行“where column = val”的每一列都有索引。对于数据类型而言,也许不是世界上最完美的索引,但至少是一个索引。
设置您的外键。还可以在相关的地方设置 ON DELETE 和 ON MODIFY 规则,以级联或设置 null,具体取决于您的对象结构(因此您只需在对象树的“头部”删除一次,所有该对象的子对象都会得到自动删除)。
如果你想模块化你的代码,你可能想模块化你的数据库模式 - 例如,这是“客户”区域,这是“订单”区域,这是“产品”区域,并在它们之间使用连接/链接表,即使它们是 1:n 关系,并且可能复制重要信息(即,将产品名称、代码、价格复制到您的 order_details 表中)。阅读规范化。
其他人会为上述部分或全部推荐完全相反的方法:p - 从来没有一种真正的方式来做一些事情!
【讨论】:
explain analyze 对其进行测试。
Head First SQL 是一个很好的介绍。
【讨论】:
在我看来,这些问题需要来自不同领域的不同知识。
也就是说,也许你想读一些书,我个人在我的数据库大学课程中使用了this book(找到了一个不错的,但我没有读过这个领域的其他书,所以我的建议是看看数据库设计方面的一些好书)。
【讨论】:
我已经有一段时间没有阅读它了(所以,我不确定其中有多少仍然相关),但我记得 Joe Celko 的 Smarties SQL 这本书提供了很多关于编写优雅、有效的信息,和高效的查询。
【讨论】: