0

我们计划在 PHP(Symfony 2)和 PostgreSQL 中创建一个 Web 应用程序的新项目(完全重新启动)。目前我们使用 PHP 和 MySQL (MyISAM)。-> 网络应用程序

当前和新的 webapp 依赖于另一个系统 (.NET),包括一个数据库 (MS SQL 8 / 2000),它不会很快被修改(更改或合并数据库),因为整个 megillah 有一个复杂的工作流程 -> 遗留系统
BTW:最大的表总共有 2700 万行

大多数数据/表格每天都会多次从遗留数据库传输到 webapp 数据库。对于新的 webapp,我们已经重新设计了大部分数据库模式,所以我们现在几乎有一个规范化的模式(遗留数据库的模式是大量冗余并且非常混乱)

当前,传输作业尝试插入数据。当特定代码出现异常时,我们知道该行已经存在,然后进行更新。这是因为性能(更新前没有选择)。

对于新的 webapp 模式,我们仍然希望使用与旧数据库中相同的主 ID。但是有一些问题,其中之一:一些表的主键看起来像一个整数,但它们不是。大多数行都有整数,例如123456,但是,有些行的字符像123456P32

现在新模式有两个选项:

  1. 对 PK 和风险性能问题使用字符串类型
  2. 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 的默认索引系统的索引时,应该没问题。

你怎么看?您对具有遗留依赖项的类似系统有一些经验吗?

4

2 回答 2

1
  • 带有文本 PK 的 PostgreSQL 性能还不错——为了简单起见,我会选择它。

  • 你没有告诉我们这些钥匙能有多长。使用您的转换,普通整数仅适用于 4 个字符键,而 bigint 仅适用于 9。

于 2012-10-25T15:54:59.530 回答
1

使用 CREATE DOMAIN 隔离建议的数据类型。然后构建并测试原型。你很幸运;您不乏有效的测试数据。

create domain legacy_key as varchar(15) not null;

create table your_first_table (
  new_key_name legacy_key primary key,
  -- other columns go here.
);

要使用整数键测试第二个数据库,请转储模式,更改那一行(如果您想同时拥有它们,请更改数据库的名称),然后重新加载。

create domain legacy_key as bigint not null;

您应该认真考虑完全按原样存储遗留系统的主键。无需调试 - 非常安心。如果您必须转换,请小心使用“1234P45”之类的值。如果该字母恰好是ED,则某些应用程序会将其解释为表示指数。

如果您使用 10 或 15 个字符的 varchar() 键,尤其是在 9.2 版中,您不应该因为键长度而出现性能问题。在开始之前阅读有关索引的文档。PostgreSQL 支持的索引种类比大多数人意识到的要多。

于 2012-10-25T16:11:04.277 回答