我们计划在 PHP(Symfony 2)和 PostgreSQL 中创建一个 Web 应用程序的新项目(完全重新启动)。目前我们使用 PHP 和 MySQL (MyISAM)。-> 网络应用程序
当前和新的 webapp 依赖于另一个系统 (.NET),包括一个数据库 (MS SQL 8 / 2000),它不会很快被修改(更改或合并数据库),因为整个 megillah 有一个复杂的工作流程 -> 遗留系统
BTW:最大的表总共有 2700 万行
大多数数据/表格每天都会多次从遗留数据库传输到 webapp 数据库。对于新的 webapp,我们已经重新设计了大部分数据库模式,所以我们现在几乎有一个规范化的模式(遗留数据库的模式是大量冗余并且非常混乱)
当前,传输作业尝试插入数据。当特定代码出现异常时,我们知道该行已经存在,然后进行更新。这是因为性能(更新前没有选择)。
对于新的 webapp 模式,我们仍然希望使用与旧数据库中相同的主 ID。但是有一些问题,其中之一:一些表的主键看起来像一个整数,但它们不是。大多数行都有整数,例如123456
,但是,有些行的字符像123456P32
。
现在新模式有两个选项:
- 对 PK 和风险性能问题使用字符串类型
PK 使用整数类型并进行转换 转换可能如下所示(基于字符)
legacy new -------------------------- 0 10 1 11 2 12 . .. 9 19 a 20 b 21 . .. y 45 z 46 A 50 (not 47, because the arity of the second digit is 'clean' with 50) B 51 . .. Z 76
旧版 pk 123将转换为111213,因此长度是原始长度的两倍。另一个例子123A9 -> 1112135019。因为每个字符都有两位数字,所以它也可以转换回来。
我的第一个疑问是稀疏的 PK 会带来一些性能问题,但是当使用 b-tree(自平衡)作为 Postgres 的默认索引系统的索引时,应该没问题。
你怎么看?您对具有遗留依赖项的类似系统有一些经验吗?