doctrine / shards
此包已被废弃,不再维护。未建议替代包。
无法获取此包最新版本(v1.0)的许可证信息。
v1.0
2012-05-08 20:31 UTC
Requires
- doctrine/dbal: >=2.1
This package is not auto-updated.
Last update: 2020-01-18 05:01:25 UTC
README
Doctrine ORM 支持水平分片的扩展。
想法
在 Doctrine 中实现分片,尽可能减少对开发者的干扰。
需要解决的问题
- 将 INSERT 语句发送到何处?
- 如何生成主键?
- 如何选择更新、删除语句的分片?
- 如何选择选择操作的分片?
- 如何合并跨越多个分片的查询?
- 如何处理/防止无法合并的多分片查询(GROUP BY)?
- 如何处理非分片数据?(例如静态元数据表)
- 如何处理多个连接?
- 在 DBAL 或 ORM 层面上实现?
路线图
版本 1:DBAL 2.3(多租户应用)
1. ID Generation support (in DBAL + ORM done)
2. Multi-Tenant Support: Either pick a global metadata database or exactly one shard.
3. Fan-out queries over all shards (or a subset) by result appending
版本 2:ORM 相关(复杂)
4. ID resolving (Pick shard for a new ID)
5. Query resolving (Pick shards a query should send to)
6. Shard resolving (Pick shards an ID could be on)
7. Transactions
8. Read Only objects
数据库模式的技术要求
分片表需要将分片分配键作为它们的一个列。这将与您与规范化 db-schema 相比代码产生影响。如果您有一个 Blog <-> BlogPost <-> PostComments 实体通过 blog_id
分片,那么 PostComment 表也需要此列,即使“非分片”,规范化的 DB-Schema 不需要此信息。
实现细节
假设
- 对于查询,您要么想查询所有,要么恰好查询一个分片。
- 所有分片表的 ID 必须在所有分片中都是唯一的。
- 非分片数据在所有分片之间进行复制。它们冗余地保留信息。这是使跨分片的连接查询能够工作所必需的。
- 如果您从一个分片检索对象 A,那么该对象的引用和集合也位于同一分片上。
- 所有分片上的数据库模式都是相同的(或兼容的)
SQL Azure 联邦
SQL Azure 是一个特殊情况,点 1、2、3、4、7 和 8 部分在数据库级别上处理。这使得它成为仅针对点 5-6 中的功能子集的完美测试实现。但是,需要有一种方法来配置 SchemaTool 生成 SQL Azure 上的正确模式。
- SELECT 操作:最简单的假设是始终查询所有分片,除非用户明确指定。
- 可以在 PHP 代码中合并查询,这显然不适用于 DISTINCT、GROUP BY 和 ORDER BY 查询。
通用分片
需要更多功能才能在 PHP 层面上实现分片,独立于数据库支持
- 多个连接的配置,一个连接 = 一个分片。
- 主键生成机制(UUID、中央表、序列模拟)
主要用例
- 多租户应用
这种方法更容易支持,因为您可以在请求初期就确定整个请求的分片ID。在这里,查询也可以始终限制在单个分片上。
- 按某些属性进行扩展(轮询?)
这种策略需要根据访问的数据在单个请求中访问多个分片。