我有一些想法,这些想法是我随着时间积累下来的,但我真的想知道在建模数据库时让您感到顺畅的原因:
- 表名与主键名称和描述键匹配
- 按功能区划分模式
- 尽可能避免使用组合主键(使用唯一约束)
- 驼峰式命名表名和字段名
- 不要为表添加tbl_前缀,也不要为过程添加SP_前缀(不使用匈牙利标记法)
- OLTP数据库应至少符合BCNF / 4NF。
我有一些想法,这些想法是我随着时间积累下来的,但我真的想知道在建模数据库时让您感到顺畅的原因:
还有一件事情我还没有看到提到:
永远不要使用数据库关键词作为对象名称。您不希望每次使用它们时都要进行限定。
如果你在创建时拼写错误,那么在注意到错误后立即纠正。不要花费多年时间去记住在这个表中,UserName实际上是Usernmae。在代码量不大的时候修改它会更加容易。
永远不要使用暗示连接(逗号语法),总是明确指定连接。
文档
规范化和引用完整性
维护:运行定期脚本以查找
做好以下几点:
我对 Oracle 的标准如下:
在 SQL Server 中,唯一的修改是对于数据库对象名称使用驼峰命名(例如 PartyName 而非 party_name)。
查询通常会按多行编写,每行只包含一个子句或条件:
SELECT field1, field2, field2
FROM tablename t1
JOIN tablename2 t2 ON t1.id = t2.tablename_id
WHERE t1.field1 = 'blah'
AND t2.field2 = 'foo'
如果SELECT子句够长,我会把每个字段拆成一行。
定期备份数据库是十分重要的,请不要忘记。
不要在字段名中使用类型名称。老一辈的人可能还记得旧的MS标准lpszFieldName和随之而来的愚蠢。
使用描述性的字段名,遵循正常语言习惯。例如,“FirstName”而不是“NameFirst”
字段名中的每个单词都大写
不要使用下划线
不要使用常规关键字,如“Index”
不要在任何对象类型前缀中加入任何内容。例如,我们不使用tblCustomers或spCustomersGet。这些不允许进行良好的排序并且提供零价值。
使用模式定义数据库的不同区域。例如sales.Customers和hr.Employees。这将消除大多数人使用的前缀。
任何类型的循环都应该受到怀疑。通常有更好的基于集合的方法。
对于复杂的连接,请使用视图。
尽可能避免复杂的连接。拥有一个CustomerPhoneNumbers表可能更美观,但是说实话,我们真的需要存储多少电话号码?只需将字段添加到Customers表中。您的数据库查询速度会更快,而且更容易理解。
如果一个表将一个字段称为“EmployeeId”,那么每个引用它的表都应该使用该名称。它不需要被称为CustomerServiceRepId,只因为它在扩展表中。
几乎所有的表都有“s”结尾。例如:Customers,Orders等。毕竟,表保存了许多记录...
使用分析工具评估您的查询、索引和外键关系。即使是为您生成的那些。你可能会感到惊讶。
支持多对多关系的链接表在名称中同时包含两个链接表。例如,SchoolsGrades。通过表名非常容易知道它的作用。
保持一致。如果您开始按照约定走下去,请不要半途而废,除非您愿意重构所有以前的工作。这应该阻止任何“这样做不好吗?”的想法,这会导致混淆和大量的重复工作。
在键入之前请先思考。您真的需要那个表、字段、sproc或视图吗?您确定它没有被其他地方覆盖吗?在添加之前获得共识。如果由于某种原因必须将其取出,请先与团队交谈。我曾经在某些地方,DBA每天都会进行破坏性的更改,而不考虑开发人员。这不好玩。
如果数据库是为特定应用程序而设计的,请建立一个版本表,以便可以检查数据库发布与代码发布之间的匹配情况(除其他原因外)。
我总是尽量避免在字段名中使用类型 —— “sFirstName”,“sLastName”或“iEmployeeID”。虽然它们一开始匹配,但如果有任何变化,它们就会失去同步,以后更改这些名称会带来巨大的麻烦,因为您必须同时更改依赖对象。
Intellisense和GUI工具使得查找列的类型非常容易,因此我认为这并不是必要的。
WITH子句真正有助于将查询分解为易于管理的部分。
此外,对于查询执行计划的效率也非常有帮助。