前言
ios开发中,对数据库操作中,使用sqlitepersistent object第三方类的时候,某个实体类aEntityClass,则它对应的表名为a_entity_classes,且类的属性跟表中的列名也是这种对应方式。查了相关资料,才明白有一些ORM因素(active record)在里面。(可以参考下 数据库命名规范--通用)
Active Record
许多开发者很疑惑为什么 FleaPHP 以高效开发为目标,却没有提供 Active Record 模式。本文尝试详细阐述这个问题。
Active Record 是什么?
Active Record 模式中文名为“活动记录”,在《企业应用架构模式》(PoEAA)一书中定义如下: 活动记录(Active Record):一个对象,它包装数据库表或视图中的某一行,封装数据库访问,并在这些数据上增加了领域逻辑。
举个例子来说,一个图书数据表,每一条记录就是一本图书的信息。那么采用 Active Record 时,每一本图书就是一个 Active Record 对象实例。
Active Record 因 Ruby On Rails 而流行:
Active Record 之所以现在这么炙手可热,甚至许多人将 Active Record 和 ORM 划等号,完全是 Ruby On Rails 的原因。
在 Ruby On Rails 中,Active Record 除了最基本的将数据记录和一个对象互相映射外,还提供了数据(而不是对象)间关联关系的处理。例如:一本图书有一个或者多个作者,所以每一个图书对象都和多个作者对象关联。反过来一个作者可以写多本书,所以一个作者对象也和多个图书对象关联。
在 RoR 中,我们获取一个图书对象时,自动就获得了该图书对象所对应的作者对象(本质上是图书数据对应的作者数据)。更进一步,通过图书对象关联的作者对象,我们 可以获取该作者所写的所有图书的对象实例。而这些工作,在 RoR 中只需要几行代码而已,以前我们需要写上一大段代码才能实现同样的效果。
RoR 中,对 Active Record 模式的实现完全利用了 Ruby 语言的灵活性,简短几行代码就可以定义一个关联。并且通过复杂的 ActiveRecord:Base 对象,提供了 CRUD(创建、读取、更新、删除)操作的默认处理。所以使用 RoR 时,绝大部分常见的数据库操作只需要很少量的代码就可以完成,大大提高了开发效率。
Active Record 与 ORM
许多人将 Active Record 与 ORM 划等号,这是错误的。ORM(对象关系映射)是将对象及对象间的关系(继承、聚合等)映射到关系式数据库中。由于面向对象和关系式数据库天生的不匹配,所以这种映射是相当复杂的。
而 Active Record 原本只是将一个数据行记录包装为一个对象,只是在 RoR 中由于添加了对关系的处理,而具有了一些 ORM 的特征。所以可以简单的将 RoR 中的 Active Record 看作 ORM 的一种实现方式。但本质上,RoR 中的 Active Record 是处理数据间的关系而不是对象间的关系(但支持对象继承),因为每一个 Active Record 对象都是和数据表一一对应的。
那为什么在 Java 世界中,没有大量采用 Active Record 模式呢?
在 Java 世界中,绝大部分 ORM 都是作为中间件存在的。由于 Java 与 Ruby、PHP 等脚本语言截然不同的运行机制。所以即便是很复杂的中间层,只要能够在运行时提供良好的性能,那就能够被开发者接受。而 Hibernate 这样的 ORM 中间件能够提供比 Active Record 多得多的功能和灵活性,所以 Active Record 模式在 Java 世界不受欢迎就可以理解了。
而在 .NET 世界中,大量使用的都是表数据入口(
Table Data Gateway)和表模块(
Table Module)。这两种模式由于有 Microsoft 出色的 IDE 支持,所以能够获得很高的开发效率,自然 .NET 开发者对 Active Record 模式也不感兴趣了。
ruby on rails
Ruby on Rails 是一个可以使你开发,部署,维护 web 应用程序变得简单的框架。主要特点:
第一是架构。在过去的时间里,许多开发者在严谨的 web 应用程序上使用 MVC 架构。他们发现 MVC 架构可以使他们的程序变得更清晰,在 java 中像 Tapestry 和 Struts 这些框架都是基于 MVC 。 Rails 也是一个 MVC 框架。当你使用 Rails进行开发,应用程序的所有代码以一种标准方式互相作用。在开始开发之前,整个应用程序的骨架已经搭好的。
第二个是看编程语言。 Rails 程序是使用 Ruby 编写的,它是一门现代,面向对象的脚本语言。 Ruby 简洁,不难理解。它可以让你快速地用代码自然 , 清晰表达想法。让你的程序能很简单被编写并且在几个月后还能很容易读懂。
Ruby on Rails是一个 Web 应用程序框架,是一个相对较新的 Web 应用程序框架,构建在 Ruby 语言之上。它被宣传为现有企业框架的一个替代,而它的目标,简而言之,就是让生活,至少是 Web 开发方面的生活,变得更轻松。
Rails命名约定之—— 混合大小写,下划线和复数:
我们经常使用短语来命名变量和类。
在Ruby里通常约定变量的名字全是小字母,单词之间用下划线隔开。类和模块命名则不同:它们没有下划线,短语中采用混合大小写模式——即每个单词的第一个字母以大写开头。这些约定会这样命名变量,比如order_status,和类名字如LineItem。
Rails中采用了这种命名约定并以两种方式进行了扩展。
首先,它假定数据库的表名和变量名一样,都是小写字母,单词之间是下划线。Rails还假定表名总是复数形式。
另一方面,Rails假定文件以带有下划线的小写字母命名。Rails使用这些命名约定来自动转换名字。
例如,你的应用程序可能包含一个model类,它用来处理商品项目。你已经使用Ruby的命名约定来定义这个类,叫LineItem。通过这个名字,Rails将自动推论出以下的规则1、对应的数据库表名被称为line_items。这是类名字,被转换成小写字母,并在单词和复数之间使用了下划线。
2、Rails也将知道从一个叫line_item.rb(在app/models目录中)的文件中去寻找类LineItem的定义。
数据库命名规范--app
数据表
采用
Pascal样式命名,命名格式为[表名]。
示例:Employee 、Product 第一个字母大写
主要是参考SQL Server 2005示例数据库,个人理解不采用复数是为了更好的使用ORM工具生成符合编程规范的代码(比如C#)。
示例:使用Product 而不是Products
数据视图
视图名称采用
Pascal样式命名,命名格式为v + [视图名称]。
示例:vEmployee vSalesPerson
数据列
列名称命名采用英文单词或缩写,英文单词只来自于具体业务定义,尽量表达清楚含义。采用Pascal样式命名,命名格式为[列名称]。
示例:AddressID
PostalCode 尽量避免使用拼音命名,如果不可避免,对于比较短的列名,采用拼音全写,如果拼音列名比较复杂,可以采用首个字用全拼,其它字用首字母大写表示。
示例:福州 Fuzhou
存储过程
建议采用Camel样式命名,命名格式为[存储过程名称]。
示例:uspGetUser
函数
自定义函数采用Camel命名,命名格式为[函数名]。
示例:
ufnGetDate()
触发器
采用Camel样式命名,命名单词能够描述DDL触发器功能。
DISCUSSION:
--关于表主键的命名:表名+ID,eg:OrderID。
个人认为,ios开发的时候使用这里的命名规范,因为这样能和实体类对应起来。使用下划线那种通用的,可能移植到其他平台方便,但sqlite数据库没什么可移植性,数据库使用“下划线”这种命名方式和Obj-c命名风格相差太大,跟实体类相差太多,不利于写SQL语句。而且sqlite对列名大小写不敏感,使用这里的命名规范更方便。