【问题标题】:How Important is SQL Portability?SQL 可移植性有多重要?
【发布时间】:2010-10-17 01:17:53
【问题描述】:

在我看来,从个人经验和 SO 问题和答案来看,SQL 实现差异很大。 SQL 问题的首要问题之一是:您使用的是什么 dbms?

在使用 SQL 的大多数情况下,有多种方法可以构建给定的查询,即使使用相同的方言也是如此。但我发现有趣的是,各种方法的相对可移植性经常没有被讨论,也没有被高度重视。

但即使忽略任何给定应用程序可能会或不会进行转换的可能性,我认为我们更希望我们的技能、习惯和模式尽可能可移植。

在您使用 SQL 的过程中,您对标准 SQL 语法的偏好程度如何?你如何积极地避免适当的变化?请在回答时不参考专有偏好,以实现更好的性能,大多数人会承认这通常是一种足够合理的辩护。

【问题讨论】:

    标签: sql portability


    【解决方案1】:

    我投票反对标准/供应商独立的 sql

    • 实际切换数据库的情况很少。
    • 没有完全符合当前sql标准的单一数据库。因此,即使您符合标准,您也不是独立于供应商的。
    • 供应商差异超出了 sql 语法。锁定行为是不同的。隔离级别不同。
    • 数据库测试非常困难且开发不足。如果您不是绝对需要的话,无需通过在游戏中加入多个供应商来使其变得更加困难。
    • 在供应商特定的调整中有很多功能。 (想想“限制”、“分析函数”或“提示”)

    所以精髓: - 如果不需要供应商独立性,请针对您实际使用的供应商进行专业化。 - 如果需要供应商独立性,请确保谁来支付账单,这将花费金钱。确保每个 rdbms 都可用于测试。并且也使用它 - 将每条 sql 放在一个特殊的层中,这是可插拔的,因此您可以使用数据库的强大功能并与不同的供应商合作 - 仅当差异是纯粹的语法问题时才符合标准,例如对(外部)连接使用 oracle 表示法与 ANSI 标准语法。

    【讨论】:

    • 第二个主张是勇敢的;你的来源是什么?如果您证明或取消索赔,我会很高兴地推翻您的反对票(所以请不要进行不必要的报复)。我被可靠地告知 DB2/z 严格遵守。
    • 除非您的项目从一开始就声明并针对多个数据库,否则切换的可能性几乎为零 - 可移植性毫无意义,我同意
    • 你读过这个问题吗? 1.我已经打折了数据库切换。 2.您是否认为汽车安全设备无关紧要,因为没有汽车是防撞的? 3. 非语法差异是一条红鲱鱼。 4. 我没有加入多个供应商。 5. 我承认表现是正当的辩护。
    • @le dorfier:我读过这个问题。但我认为排除重要原因没有意义
    • @le dorfier 关于 2。我认为如果安全带没有连接到车架上,它就无关紧要了。是的
    【解决方案2】:

    我们的商店非常重视这一点。我们不允许非标准 SQL 或扩展,除非它们在所有主要平台上都受支持。即使这样,它们在代码中也被标记为非标准,并且需要证明。

    应用程序开发人员不能让他们的查询快速运行,我们有明确的职责分离。该查询只能由 DBMS 本身或 DBMS 的 DBA 调整来优化。

    真正的数据库,如 DB2/z :-),处理标准 SQL 的速度非常快。

    我们强制执行此操作的原因是为客户提供选择。他们比我们更不喜欢被锁定在特定供应商的想法。

    【讨论】:

    • 有趣,我从 SAP 等公司那里听说过这样的事情。在sql层面解决厂商独立问题的原因是什么?
    • 不确定我是否完全理解这个问题,@Jens。如果您问我们为什么要强制执行纯标准 SQL,它是为了允许在供应商(和平台)之间轻松转换。所以,当 MySQL 现在不再削减它时,我们可以迁移到 SQL Server,然后是 DB2/LUW,最后是 DB2/z。所有这些都无需更改应用程序。
    • /* 但从不使用 Oracle,它仍然无法区分空字符串和 NULL :-) */
    • 我的问题基本上是:你为什么不使用使用专有sql的可插入层,但可以交换不同的rdbms
    • 另一个需要维护的层。如果您按照标准编码,则不需要它,您可以根据需要迁移到更合适的 DBMS 以提高性能。请记住,这是我们这样做的方式,它不一定是唯一(或正确)的方式,尽管我们相信如此,否则我们不会这样做。
    【解决方案3】:

    根据我的经验,查询可移植性并不是那么重要。我们使用各种数据源(主要是 MSSQL 和 MySQL),但我们知道哪些数据存储在哪里,并且可以进行相应的优化。由于我们控制系统,因此我们决定何时移动结构以及何时需要重写查询。

    我还喜欢使用某些其他特定于服务器的功能,例如 MySQL 不提供的 SQL Server 中的查询通知。因此,我们再次在可能的情况下使用它,而不用担心可移植性。

    此外,我们的部分应用需要查询架构信息并对其采取行动。在这里,我们再次为不同系统提供特定于服务器的代码,而不是试图将自己限制在最低的公分母上。

    【讨论】:

      【解决方案4】:

      SQL 可移植性是否可取没有明确的答案 - 这在很大程度上取决于具体情况,例如应用程序的类型。

      如果应用程序将成为一项服务 - 即只有您托管它,那么显然没有人会关心您的 SQL 是否足够便携,因此只要您没有特定的 SQL,您就可以放心地忽略它计划停止对您当前平台的支持。

      如果应用程序要安装在多个站点,每个站点都有自己建立的数据库系统,显然 SQL 可移植性对人们来说非常重要。它可以让你拓宽你的潜在市场,并且可以让那些对他们的数据库系统持观望态度的客户放心。无论您是想支持这一点,还是只向 Oracle 客户销售产品,还是只向 MySQL/PostgreSQL 客户销售产品,这都取决于您和您认为的市场。

      如果您使用 PHP 进行编码,那么绝大多数潜在客户可能会期待 MySQL。如果是这样,那么假设 MySQL 没什么大不了的。或者类似地,如果您使用 C#/.NET,那么您可以假设 Microsoft SQL Server。然而,同样存在另一面,因为 PHP 或 .NET 用户可能存在一个较小但竞争较弱的市场,这些用户希望连接到其他数据库系统,而不是通常。

      因此,我主要将此视为一个市场研究问题,除非在我的第一个示例中,您提供的托管服务对用户无关紧要,在这种情况下,这只是为了您自己的方便。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-05-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-20
        相关资源
        最近更新 更多