从 Oracle、MSSQL 或其他纯关系型数据库系统迁移到多模型 InterSystems IRIS 是一项战略决策,需要认真规划和执行。虽然这种过渡具有显著的优势,包括增强性能、可扩展性和对现代架构的支持,但它也伴随着挑战。在本文中,我将重点介绍与编码相关的一些注意事项,以确保成功迁移。与结构和数据的实际迁移相关的所有事项都不在本文讨论范围之内。
.png)
首先,当你考虑迁移到不同的数据库系统时,你需要了解你的业务逻辑,无论是在应用程序(应用服务器)还是数据库服务器端。基本上,你需要重写的 SQL 语句在哪里?
如果应用程序逻辑严重依赖于直接在应用程序代码中执行的 SQL(而不是数据库中的存储过程或触发器),那么从关系数据库迁移到 InterSystems IRIS 时,就需要仔细检查 SQL 语句。让我们来看看你需要考虑的一些最重要的因素。
- SQL 方言差异。IRIS SQL 支持 SQL-92 标准。这并不意味着一些更现代的功能没有实现。这只是意味着你需要事先检查。例如,窗口函数出现在 SQL:2003 中,但你仍然可以在 IRIS 中编写它们:
--window function
select id, rating
from (select a.id,
r.rating,
avg(r.rating) over () as avg_rating
from SQLUSER.Actor a join SQLUser.Review r on a.id = r.Reviews) as sub
where rating > avg_rating同时,不支持新的复杂数据类型,如 XML、JSON、数组和地理数据类型。因此,以下查询
SELECT a.id,
a.firstname,
ARRAY_AGG(r.rating) AS ratings
FROM SQLUSER.Actor a LEFT JOIN SQLUser.Review r ON a.id = r.Reviews
GROUP BY a.firstname将返回错误信息:ERROR #5540: SQLCODE: -359 Message: User defined SQL function 'SQLUSER.ARRAY_AGG' does not exist
但这并不是世界末日。有很多内置函数可以让你重写查询,从而得到预期的结果。
2.内置函数。不同的 DBMS 有不同的内置函数。因此,您需要了解它们与 IRIS 中可用函数的对应关系。下面是我所说的几个例子,Oracle 中使用的函数和 IRIS 中的对应函数:
| 甲骨文 | IRIS |
| NVL | ISNULL(字段,默认值) |
| 子串 | $extract(field, start_pos, end_pos) |
| instr | $find(field, text_to_find) |
| 连接 | {fn CONCAT(string1,string2)} |
当主要SQL 逻辑位于数据库(如存储过程、触发器、视图)中时,迁移到 InterSystems IRIS 需要采用不同的方法。以下是一些注意事项:
- 数据库对象迁移
- 必须使用 ObjectScript 重写所有存储过程。这也是改用对象模型的好时机,因为当你创建一个类时,无论如何都会得到一个表。不过,使用类可以编写方法(可作为存储过程调用),并充分发挥面向对象范例的威力。
- IRIS支持触发器、索引 和视图 。如果不使用任何不支持的函数/语法,表列保持不变,你甚至可以让视图保持原样(见上一点)。
- 定义的迁移也很重要,可能会带来一些挑战。首先,您必须小心地将以前数据库中的数据类型与 IRIS 匹配,尤其是在使用新的复杂类型时。此外,由于索引具有更大的灵活性,您可能希望以不同的方式重新定义索引。
在决定从不同的关系数据库迁移到 InterSystems IRIS 时,您需要考虑以下事项。这是一项战略决策,可以带来显著的效益,包括提高可扩展性、性能和效率。但是,仔细规划对于确保无缝过渡以及满足兼容性、数据转换和应用程序重构需求至关重要。