【问题标题】:Where to put Stored Procedures & Swapping DB Tech?在哪里放置存储过程和交换数据库技术?
【发布时间】:2012-07-19 13:49:11
【问题描述】:

这绝对是疯子.....

我刚刚开始从事一个新项目,我对刚刚看到的内容感到震惊。该项目是一个位于 Oracle 数据库之上的 C# Web 应用程序。现在所有的存储过程实际上都不是存储过程......它们只是存储在服务器目录中的文本文件中的 SQL 脚本。当应用程序启动时,它会查看目录并遍历每个文件并读出文本并将其保存在字典中。它还在文本上运行正则表达式,删除 [PARAM] 等特殊序列,并用正确的符号替换它们,例如':' 在 Oracle 的情况下或 '@' 用于 SQL SERVER。然后,当代码想要执行其中一个语句时,它会调用一个方法,该方法在字典中找到正确的语句并运行它。

现在这似乎已经完成,以防他们想要交换底层数据库技术。他们说他们只需将目录中的 sql 文件换成具有适当语法的文件即可。

现在我通常希望存储过程实际上是存储过程并存在于数据库中。与数据库对话的单独项目(层)。然后,如果 db 技术发生变化,只需添加另一个数据层项目并将 dll 换出....

我发现目前的做法存在很大问题:

  • 正在创建的数据库服务器上没有执行计划。
  • 大量开销读取数百个文本文件,为每个文件构建一个字符串,在其上运行正则表达式。
  • 不检查 SQL 语法。
  • 内存占用很大,所有这些存储过程都在内存中

你觉得怎么样?

这真的很糟糕还是我只是在呻吟,因为我以前从未见过这样的事情?

这种方法还有什么问题?

任何 cmets 都将不胜感激,因为我正试图向同事传达这太疯狂了....

【问题讨论】:

  • 当仍然需要存储过程和数据库逻辑时,我已经看到了一些使数据库不可知的解决方案。这方面的每一个例子都是 YAGNI 的典型代表……从来没有人改变过数据库。我以前见过这样的事情,但没有在数据库提供者之间进行转换。除了缓存点之外,我最初必须同意您的所有担忧。加上维护和添加一些东西必须是一项半工作。
  • leigh - 我的“心”向你倾诉。正如上面提到的亚当,这是一个寻找问题的解决方案(尽管很弱)。没有进行优化,因为驱动器故障存在严重的风险(当然,会有备份??)。总而言之,无论谁想到了这种情况,都应该在他们的“掩体”中颤抖,因为当事情没有按预期工作时,你无疑会定期寻找他们。祝你好运(是的 -BONKERS)!!

标签: sql database architecture


【解决方案1】:

他们为什么不在构建时使用脚本以本地语法(PSQL、T-SQL)创建存储过程脚本,然后可以将其部署到数据库中?我看不出这会做太多的工作,而且你会得到编译存储过程代码等的所有好处。

我的个人经验是,存储过程 (SQL Server) 的运行时编译会带来很大的性能开销,而在生产系统上,这是一个真正的问题。

我可以看出这个设计背后的原因:

  • 存储过程代码太特定于数据库,所以我们不会使用 存储过程,我们将使用 SQL 语句。

  • 甚至 SQL 语句中也可以包含特定于数据库的语法,因此 我们将有一些方法来即时转换它们 运行时。

即使你不使用存储过程,我仍然认为转换应该在构建时完成(例如,生成 C# 代码),而不是运行时。

【讨论】:

    【解决方案2】:

    你觉得怎么样?

    我认为这是过度设计的典型案例:谁更改了他们的数据库提供程序? 真的会带来什么吗?

    这真的很糟糕还是我只是在呻吟,因为我从未见过 以前有过这样的事吗?

    在我看来两者兼而有之:这很糟糕,但如果它们已经像这样运行了一段时间,它一定会起作用。

    这种方法还有什么问题?

    事实上,每次重新计算执行计划可能是最大的问题:
    性能损失如此之大!我说可能是因为性能并不总是要求(过度优化也不是更好;)
    真正错误的是他们重新发明了轮子:LINQ 做到了本机。
    这意味着随着 LINQ 的不断改进,该公司将逐渐落后,因为他们不会从改进中受益。

    如果您有任何影响力,请尝试与他们讨论 LINQ。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-02-20
      • 1970-01-01
      • 1970-01-01
      • 2019-12-22
      • 2015-10-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多