第5章 数据库 - 5.1 SQL数据库
关系型数据库依然是我们开发的主力数据库,实际上Blade是不愿意在数据库这一层做一些处理的,
但为了方便开发者还是做了简单的ActiveRecord
Java实现,虽然不像ROR里面那么纯粹,
但已经足够大部分的日常使用了,当然Blade不局限你使用任何数据库框架来操作。
关系型数据库把数据存储在表中,表模拟程序中不同的实体。例如,订单管理程序的数据库中可能有表 customers
、products
和orders
。
表的列数是固定的,行数是可变的。列定义表所表示的实体的数据属性。例如,customers
表中可能有name
、address
、phone
等列。
表中的行定义各列对应的真实数据。
表中有个特殊的列,称为主键,其值为表中各行的唯一标识符。
表中还可以有称为外键的列,引用同一个表或不同表中某行的主键。
行之间的这种联系称为关系,这是关系型数据库模型的基础。
下图展示了一个简单数据库的关系图。
这个数据库中有两个表,分别存储用户和用户角色。
连接两个表的线代表两个表之间的关系。
在这个数据库关系图中,roles
表存储所有可用的用户角色,每个角色都使用一个唯一的id
值(即表的主键)进行标识。users
表包含用户列表,每个用户也有唯一的id
值。除了id
主键之外,roles
表中还有name
列,users
表中还有 username 列和 password 列。 users 表中的 role_id 列是外键,引用角色的 id ,通过这种方式为每个用户指定角色。
从这个例子可以看出,关系型数据库存储数据很高效,而且避免了重复。将这个数据库中 的用户角色重命名也很简单,
因为角色名只出现在一个地方。一旦在roles
表中修改完角色名,所有通过 role_id
引用这个角色的用户都能立即看到更新。
但从另一方面来看,把数据分别存放在多个表中还是很复杂的。生成一个包含角色的用户列表会遇到一个小问题,
因为在此之前要分别从两个表中读取用户和用户角色,再将其联结起来。关系型数据库引擎为联结操作提供了必要的支持。