spl*_*tne 16 sql database database-design
在数据库设计中我应该考虑哪些新应用程序应该能够支持最常见的关系数据库系统(SQL Server,MySQL,Oracle,PostgreSQL ......)?
它甚至值得努力吗?有什么陷阱?
Bel*_*ell 15
简短的回答是坚持标准或接近标准实施的功能.这更详细地意味着:
避免使用数据库的过程语言(存储过程或触发器),因为这是系统之间存在巨大差异的地方.您可能需要使用它们来模拟某些功能,但不要使用它们来创建自己的功能.
从字段本身中分离自动增量字段的序列.对于MSSQL来说,这看起来有点强迫,但是在Oracle,DB/2等中可以完全实现,而无需任何仿真修复.
保持char和varchar字段低于您所针对的引擎集的最小最大大小.
在编写查询时,请使用完整的JOIN语法,并将JOIN括起来,以便每个连接位于单个表和括号表达式之间.
将日期处理逻辑保留在代码中,而不是查询中,因为许多日期函数都超出了标准.(例如:如果您想在过去两周内获取内容,请在代码中计算两周前的日期,并在查询中使用该日期.)
除此之外,所涉及的努力不应该太吓人,所以它可能是值得的.
我目前支持Oracle,MySQL和SQLite.说实话,这很难.一些建议是:
是值得的......好的取决于.在商业上,它对于企业级应用程序是值得的,但对于博客或说网站,如果可以的话,你可以坚持使用一个平台.
人们经常告诉您的一个答案是不要使用特定于数据库的 sql,而只使用符合 ansi 标准的代码。他们通常会说只通过存储过程与数据库交谈以抽象出任何 sql。这些都是错误的答案,只会导致痛苦。对“标准”sql 进行编码几乎是不可能的,因为每个供应商都有如此不同的解释。
您需要的是拥有某种数据库持久层来抽象数据库之间的差异(对不起,约翰斯托克,这几乎正是您所说的)。有许多其他 ORM 和类似产品可以为每个平台执行此操作,
如果我是你,我会认真考虑你的投资回报.
它总是听起来像一个伟大的想法,能够钩到任何后端或当你想改变后端,但这在现实世界中很少会发生在我的经验.
事实证明,通过仅支持Oracle和SQL Server(或MySQL和SQL Server,或......等),您可以覆盖95%的潜在客户.
在进一步研究之前做你的研究,祝你好运!
我将嘲笑 johnstok 的回答 1) 不要使用存储过程和 2) 不要使用供应商特定的 SQL,并添加到它。
你还问,“值得付出努力吗?”。我会说……也许吧。我编写了一个基于 SQL Server 的开源错误跟踪器 BugTracker.NET。有许多开发人员根本不会尝试,因为他们喜欢坚持自己熟悉的技术。而且,当我考虑开始托管服务时,我注意到专用 Linux 虚拟服务器比 Windows(非虚拟)服务便宜得多。理论上我可以在单声道下运行 C#,但是我的 SQL 是特定于 SQL Server 的(即使我不使用存储过程),移植需要付出巨大的努力。
如果您的目标是商业/企业市场,您会发现有些商店严格使用 Oracle,或者严格使用 SQL Server,并且您的应用程序可能会根据其使用的技术在早期的竞争中被排除在外。
所以,也许开放对你来说很重要。它是什么样的应用程序?谁会使用它?
你还问,“有什么好处”。不进行测试。如果您打算支持您列出的 4 个 db,那么您应该尽早并经常使用它们进行测试,而不是只针对其中一个,同时认为转换到其他数据库很容易。到那时,您可能会发现自己处于建筑的死胡同。
2001 年,我开发了一个必须支持 Oracle 8、MS SQL Server 2000 和 MS Jet 3.51(又名 Access97)的产品。从理论上讲,我们可以为这些产品中的每一个都聘请专家,并通过一个测试过程来确保所有产品都能产生相同的结果。在实践中,有趋向于最小公分母的趋势。
一种方法是在 Access/Jet for Oracle 和 SQL Server 中创建链接表,然后专门编写 Jet SQL。这里的问题是 Jet SQL 语法非常有限。
另一种方法(甚至在只使用过一种 DBMS 产品的系统上也经常使用!)是尝试在前端做更多真正应该做的工作,这些工作应该是 DBMS 的领域。这里的问题是在数据完整性方面通常是灾难性的。我相信你知道这种情况:应用程序应该避免写入非法数据,但在 DBMS 本身没有限制的情况下,它对应用程序错误开放。然后有用户知道如何通过 Excel、SQL Management Studio 等连接到数据,从而完全绕过应该确保数据完整性的应用程序......
就我个人而言,我发现自己越来越多地以我后来才发现的所谓“可移植性”的滑动比例编写代码。理想情况下,首先是我们支持的所有 DBMS 都能理解的“普通”代码,在这样做的过程中,我发现了 SQL-89 和 SQL-92 标准。接下来是可以为每个 DBMS 轻松翻译(也许使用代码)的 SQL 代码,例如 Oracle 使用了可怕的中缀外连接语法,但外连接的概念就在那里;Oracle 和 SQL Server 使用 SUBSTRING,但 Jet 要求关键字为 MID$;等等。最后,有些事情必须是特定于实现的,如果可能的话显然要避免,同时仍然适当考虑数据完整性、功能和性能。
令人高兴的是,在此期间,这些产品一直在向 ANSI SQL 标准靠拢(除了 Jet,它现在被 MS 弃用,现在似乎只有 MS Access 团队通过削减安全性和复制等主要功能来保持活力)。所以我一直保持尽可能编写标准 SQL 的习惯。