sql 用户画像数据库设计 针对与数据库无关的应用程序的数据库设计




用户画像数据库设计 (14)

一个新的应用程序的数据库设计中 ,我应该考虑哪些应该能够支持最常见的关系数据库系统(SQL Server,MySQL,Oracle,PostgreSQL ...)?

这是值得的吗? 什么是陷阱?


如果可以将与平台相关的代码隔离到特定层中,则95%的便携性几乎与便携式一样好。 就像Java被描述为“一次编写一次测试”一样 ,人们仍然需要在每个想要运行的平台上测试应用程序。

如果您对平台特定的代码持谨慎态度,那么您可以使用便携式代码来实现可以以便携方式充分完成的95%以上的功能。 需要在存储过程或其他依赖于平台的构造中完成的其余部分可以构建到一系列依赖于平台的模块中,以形成标准接口。 取决于您使用适合该平台的模块的平台。

这是“测试无处不在”和“构建平台特定模块和测试无处不在”之间的区别。 无论如何,您将需要在所有支持的平台上进行测试 - 您无法脱身。 额外的构建相对较小,并且可能比让一个非常复杂的架构尝试和完全移植这些东西少。


除了考虑到这里的许多好的和合理的答案之外,我还要补充一点,像ActiveRecord迁移 (从Ruby On Rails,但你可以使用库)可能是有用的。 它将表格创建/更改,适当的列类型,更简单的索引管理和(一定数量)排序抽象为相当简单的描述语言。

存储过程和触发器几乎被忽略,但是如果你要跨平台的话,这种功能应该可能在代码层中。

出于好奇,我已经在Oracle,MS SQL,MySQL和SQLite之间切换了相同的迁移集合,而我发现的最糟糕的问题是我必须确保列名和表名不在保留字列表中数据块。


我理解这里的其他答案,但为什么不使用存储过程? 是不是把逻辑隐藏起来?


简单的答案是坚持标准的功能,或接近标准实施。 这意味着更详细的是:

  • 避免使用数据库过程语言(存储过程或触发器)的任何事情,因为这是系统之间巨大差异的地方。您可能需要使用它们来模拟某些功能,但不要使用它们来创建自己的功能。

  • 从字段本身分离自动增量字段的序列。 这看起来有点为MSSQL强制,但将无需任何仿真修复在Oracle,DB / 2等干净地实施。

  • 保持char和varchar字段低于您所瞄准的一组引擎的最小最大大小。

  • 在编写查询时,请使用完整的JOIN语法,并将JOIN括起来,以便每个连接位于单个表格和括号内的表达式之间。

  • 在代码中保留日期处理逻辑,而不是查询,因为许多日期函数超出了标准。 (例如:如果你想获得过去两周的内容,请在代码中计算两周前的日期,并在查询中使用该日期。)

除此之外,所涉及的努力不应该太令人生畏,所以它可能是值得的。


规则1:不要使用数据库特定的功能

规则2:不要使用存储过程。

规则3:如果违反规则1,则同样违反规则2。

有很多关于不使用存储过程的评论。 这是因为语法/语义非常不同,所以移植它们是很困难的。 你不想要你重写和重新测试的代码堆。

如果您决定需要使用特定于数据库的功能,则应该隐藏这些存储过程的细节。 调用不同数据库的存储过程都是非常相似的。 在使用PL / SQL编写的过程中,您可以使用任何您认为有用的Oracle构造。 然后,您需要为其他目标数据库编写一个等效项。 这样,数据库特定的部分只在该数据库中。


我打算约翰的答案1)不要使用存储过程和2)不要使用供应商特定的SQL,并添加到它。

你还问:“这是值得的吗?” 我会说...也许。 我写了一个基于SQL Server的开源Bug跟踪器BugTracker.NET。 有许多开发者根本不愿意尝试,因为他们喜欢坚持自己熟悉的技术。 而且,当我考虑启动托管服务时,我注意到专用的Linux虚拟服务器比Windows(非虚拟)服务便宜得多。 理论上我可以在单声道下运行C#,但是我的SQL是特定于SQL Server的(即使我不使用存储的特效),这将是一个巨大的努力。

如果你的目标是一个企业/企业市场,你会发现一些商店是严格的甲骨文,或严格的SQL Server,并且你的应用程序可能会被排除在比赛的早期基于其使用的技术。

所以,也许对你开放很重要。 它是什么类型的应用程序? 谁会用它?

你也问:“什么是平价”。 没有测试,因为你走。 如果你打算支持你列出的4个数据库,那么你应该尽早和经常地对它们进行测试,而不是只针对一个,同时认为它很容易转换到其他的。 那时你可能会发现自己在一个建筑的尽头。


保持字段和表名短(<30个字符),不区分大小写。 例如TABLE_NAME和FIELD_NAME


海事组织取决于你正在开发的应用程序的类型:

  1. 一个应用程序,满足一些其他需要,涉及到存储数据,例如商业网站,业务线应用程序,甚至家庭/生活方式的应用程序。
  2. 专门设计用于操纵或管理数据库的应用程序,例如设计工具,建模工具,ETL工具。

对于案例1,只需选择一个最适合您需求的DBMS,并使用其所有专有功能的全部功能进行编码即可。

对于案例2,您可能会发现坚持所有您希望支持的DBMS支持的通用操作子集是非常可行的。


首先要考虑的是,如果独立成本低于数据库成本。 我认为有些时候对于某些产品来说是重要的,这些产品可以给客户提供选择,但是他们失去了很多数据库功能(这意味着要重新编写代码)。

对于大客户(大型应用程序),他们必须完全依赖于数据库。 对于小的定制,在一台服务器(或两台)上安装一个Oracle XE和一个MySQL是一件很麻烦的事情。

真的,我更喜欢使用多个数据库,并且应用程序知道哪个数据库是“abast”代码。


我目前支持Oracle,MySQL和SQLite。 说实话这很难。 一些建议是:

  • 避免存储过程,但是您可能需要它们在某些平台上模拟缺少的功能(请参见下文)
  • 学习如何使用触发器,因为您需要它们来模拟缺少的功能(例如使用Oracle,您不需要自动增量,所以您需要模拟它,并且使用触发器是一个不错的选择)
  • 有一个体面的测试环境,因为你需要测试大量的SQL,才能确定它在所有的平台上都做了什么。

这是值得的...以及取决于。 在商业上,它是值得的企业级应用程序,但对于博客或网站说,你可能会坚持一个平台,如果可以的话。


人们经常会告诉你的一个答案就是不使用数据库特定的sql,而仅仅是代码来标准化。 他们经常会说只能通过存储过程与数据库进行交流来抽象出任何sql。 这些是错误的答案,只会导致痛苦。 编码为“标准”的SQL几乎是不可能的,因为每个供应商都有不同的解释。

你需要的是具有某种数据库持久层的摘要数据库之间的差异(抱歉,johnstock,这几乎就是你所说的)。 还有许多其他ORM和类似的产品可以为每个平台做到这一点,


作为对此答案的补充,作为一般规则,不要让服务器生成或计算数据。 总是发送直接的SQL指令,不包括公式。 不要使用默认值属性(或使它们基本,而不是公式)。 不要使用验证规则应该在客户端执行默认值和验证规则。


如果可能,我会避免这样做。 过去我曾与其中几个数据库合作过,他们的速度非常慢(我能想到的一个特别痛苦的例子是呼叫中心应用程序,在繁忙的一天中,从一个屏幕移动到另一个屏幕花了10分钟)编写通用的SQL,而不是使用最适合特定后端的性能调优。


如果我是你,我会认真考虑你在这里的投资回报

总是听起来像是一个好主意,能够连接到任何后端,或者随时更换后端,但在我的经验中,这种情况在“现实世界”中很少发生。

通过支持Oracle和SQL Server(或MySQL和SQL Server,或者...等),您可能会覆盖95%的潜在客户。

在继续之前做好你的研究 ,祝你好运!





database-design