5.1 SQL数据库

关系型数据库依然是我们开发的主力数据库,实际上Blade是不愿意在数据库这一层做一些处理的,
但为了方便开发者还是做了简单的ActiveRecordJava实现,虽然不像ROR里面那么纯粹,
但已经足够大部分的日常使用了,当然Blade不局限你使用任何数据库框架来操作。

关系型数据库把数据存储在表中,表模拟程序中不同的实体。例如,订单管理程序的数据库中可能有表 customersproductsorders
表的列数是固定的,行数是可变的。列定义表所表示的实体的数据属性。例如,customers表中可能有nameaddressphone等列。
表中的行定义各列对应的真实数据。

表中有个特殊的列,称为主键,其值为表中各行的唯一标识符。
表中还可以有称为外键的列,引用同一个表或不同表中某行的主键。
行之间的这种联系称为关系,这是关系型数据库模型的基础。

下图展示了一个简单数据库的关系图。
这个数据库中有两个表,分别存储用户和用户角色。
连接两个表的线代表两个表之间的关系。

5.1 SQL数据库 - 图1

在这个数据库关系图中,roles表存储所有可用的用户角色,每个角色都使用一个唯一的id值(即表的主键)进行标识。
users表包含用户列表,每个用户也有唯一的id值。除了id主键之外,roles表中还有name列,
users表中还有 username 列和 password 列。 users 表中的 role_id 列是外键,引用角色的 id ,通过这种方式为每个用户指定角色。

从这个例子可以看出,关系型数据库存储数据很高效,而且避免了重复。将这个数据库中 的用户角色重命名也很简单,
因为角色名只出现在一个地方。一旦在roles表中修改完角色名,所有通过 role_id 引用这个角色的用户都能立即看到更新。

但从另一方面来看,把数据分别存放在多个表中还是很复杂的。生成一个包含角色的用户列表会遇到一个小问题,
因为在此之前要分别从两个表中读取用户和用户角色,再将其联结起来。关系型数据库引擎为联结操作提供了必要的支持。