Database design 数据库设计最佳实践

Database design 数据库设计最佳实践,database-design,Database Design,我对SQL Server、MySQL、Oracle等非常熟悉,但抛开这些数据库产品不谈,有没有资源可以帮助我设计好关系数据库?是否有类似于数据库设计的模式或最佳实践 我见过几次,数据库通常是不可伸缩的;人们对保留像isChecked column这样的列有自己的偏好,这类列本质上是布尔型的,但存储为Char(1),其值为“Y”和“N”,而不是0和1,这两个值对我来说更合适。在进行数据库设计时不犯常见错误的方法 链接到书籍或文章将不胜感激 提前感谢。最著名的最佳实践可能是数据库规范化。这组技术允许

我对SQL Server、MySQL、Oracle等非常熟悉,但抛开这些数据库产品不谈,有没有资源可以帮助我设计好关系数据库?是否有类似于数据库设计的模式或最佳实践

我见过几次,数据库通常是不可伸缩的;人们对保留像isChecked column这样的列有自己的偏好,这类列本质上是布尔型的,但存储为Char(1),其值为“Y”和“N”,而不是0和1,这两个值对我来说更合适。在进行数据库设计时不犯常见错误的方法

链接到书籍或文章将不胜感激


提前感谢。

最著名的最佳实践可能是数据库规范化。这组技术允许您设计数据库,以便删除冗余项,并对字段进行逻辑分组。

与其他技术一样,这里的答案是“视情况而定”

数据库可以用来做不同的事情,其中一些事情在设计和开发中需要相反的方向

OLTP数据库系统的设计将与用作报告或仓库解决方案的数据库系统完全不同。第一个通常是规范化的,而仓库通常是非规范化的。这有助于系统获得预期行为所需的性能

即使在这一部分中,根据使用是读重还是写重,不同的设计决策可能是合适的


最好的办法是研究数据库开发的一个小得多的部分的最佳实践,它对应于您试图构建的应用程序的类型。

我们在这里使用的一个概念是“查找代码”表。如果您有一个数据库,其中有大量对有效编码或类型等的项的引用,请将所有这些项都保存在一个LookupCode表中,该表以代码组和代码本身为基础

我们为代码的活动状态保留了一个附加标志,以及一些可选的数字列,如果给定的查找代码需要以任何方式进行排序或计算,则可以使用这些数字列


通过这样做,您可以避免在模式中散布大量的小表格。这样做的一个缺点是表的主键是代码组和代码本身,因此没有外键附加到引用给定代码的“master”表,但是应用程序中的一点强制很容易适应这种情况。

我想说,只要数据库是标准化的,并且如果您正在创建VLDB,那么正确地对其进行分区,那么您就可以了。其他最佳实践包括对存储过程使用CRUD,并确保所有表正确级联。其他大部分都是主观的。使用“Y/N”是从bit还未引入时开始的老式数据库编程。它也可以用于可伸缩性目的,如“Y/N/Maybe”,但如果是这样的话,bast practices会说将其规范化并生成一个查找表。

关于数据库设计,我读过的最好的一本书是Michael J Hernandez的《为凡人设计数据库》。这个名字听起来像一本初学者的书,但是任何级别的人都可以从中获得知识。它也是独立于平台的,因为它处理的是查看数据本身以及如何正确组织数据,而不是使用的技术

他还写了一本关于编写查询的书,名为《面向凡人的SQL查询》,我听说(我自己还没读过这本书)写得很好


有许多数据库设计模式。它们通常没有很好的形式化,因此您可能需要简单地查看大量的数据库设计

例如,请参见设计模式。还有

有博客,比如

有一本IEEE的书


谷歌搜索()的点击率达到2400万。

不要存储计算值


例如,您有表格“正方形”和列“宽度”。不需要做一列“面积”,因为它可以通过宽度^2来计算,我认为这有点相反。 我建议,不要过分强调数据库的设计

有时候这可能很难。对于内部LOB应用程序,业务的主流观点通常是数据是主要资产,而软件在某种程度上是可消耗的

我的建议是:不要买它

实际上,资产是公司与数据交互的能力。观察它,操纵它,并根据它做出决策

这意味着,即使他们可能对数据有很高的价值,但他们真正看重的是您正在编写的软件

这意味着我将把您的大部分精力放在构建有效的用户体验上,而不是“设计完美的数据库”。数据库实际上只是一个工具,使您能够提供用户体验

关系数据模型的关键特性是数据和访问路径的独立性。您可以添加列、更改键、引入或删除索引等,同时对使用它的应用程序没有影响(或接近于零)

这使得数据库结构非常灵活

试图将数据库设计为“面向未来的灵活”或“优化性能”大多是徒劳的

更改数据库结构对系统的影响相对较小

此外,在遇到需要扩展数据库的场景之前,您确实无法预测数据库将如何扩展。您最好的选择是等到遇到性能问题。然后具体解决这些问题

然而,更改应用程序的用户体验通常更昂贵。 UI工作非常耗时,通常需要一段时间才能完成

因此,我建议您:

  • 只是产生一个蹩脚的数据库设计
  • 对t反应
    Select name from peeps where accountStatusId = 5
    
    Select name 
    from peeps p 
    join accountStatus s 
    on p.accountStatusID = s.asid 
    where s.accountStatus = 'ActiveDude'