2011-12-03 56 views
2

我有一个应用程序,它看起来好像存储一些硬编码在应用程序代码中的记录而不是数据库中的条目,并且能够在查看记录时将两个记录合并为一个通用结果集。这种方法有没有陷阱?首先,除了当应用程序开发者想要的时候,它似乎更容易强制记录从不被编辑/删除。其次,在安装第三方模块等情况下,可以从配置中读取记录,而不是在db中执行插入操作(包含相关的维护问题)。在应用程序中存储一些记录,并在数据库中存储一些记录?

一些常见的例子:

         In the application  In the database 
----------------------------------- ------------------  ---------------------- 
customers        (none)     all customers 
HTML templates       default templates   user-defined templates 
'control panel' interface languages default language   additional languages 
Online shop payment processors   all payment processors (none) 

所以,我想我有根据情况三个选项:

  1. 数据库中的所有记录
  2. 在应用程序中的一些记录,一些记录在数据库中
  3. 应用程序中的所有记录

它似乎有两种方法来实现:

  1. 所有记录在数据库中:
    • A柱可以被标记为“可编辑”或“锁定”
    • 负的ID可能代表锁定的价值观和积极的ID可以代表编辑
    • 奇数编号代表锁定,甚至标识表示可编辑...
  2. 一些[R生活在应用程序(作为变量,数组或对象...)

有没有任何标准的方法来处理这种情况?我错过了一些非常明显的解决方案?

我正在使用MySQL和PHP,如果这改变了你的答案!

回答

0

一般情况下,任何时候如果你想包括东西是硬编码到工作流程你进行数据库查询的,没有任何加盟需要发生。您只需简单处理硬编码数据以及从数据库中提取的数据。如果我们正在讨论形成对象的信息,那么在应用程序中创建对象时尤其如此。例如,我可以看到,如果您希望在应用程序中始终有开发用户,这会很有用。您可以让此用户在应用程序中进行硬编码,并且每当您查询数据库时(例如登录用户时),都会在查询数据库之前检查硬编码的用户值。

例如:

// You would place this on the login page 
$DevUser = new User(info); 
$_SESSION['DevUser'] = $DevUser; 

// This would go in the user authentication logic 
if($_SESSION['DevUser']->GetValue(Username) == $GivenUName && $_SESSION['DevUser']->GetValue(PassHash) == $GivenPassHash) 
{ 
    // log in user 
} 
else 
{ 
    // query for user that matches given username and password hash 
} 

这说明怎么会有不需要是任何特殊或棘手的数据库的东西怎么回事。如果您不加以考虑,那么在数据库驱动的工作流程中包含的硬编码变量非常简单。

可能会出现这样的情况,您可能有很多硬编码的变量/对象,或者您可能想对这两组信息执行大块逻辑。在这种情况下,拥有一个包含硬编码信息的数组可能是有益的,然后您可以将查询的信息添加到该数组,然后再对其执行任何逻辑。

在支付处理器的情况下,我假定您指的是使用不同服务(如PayPal或信用卡或其他服务)的在线支付。这对于每种付款方式都具有单独功能的付款类最有意义。这样你可以调用客户选择的任何一种方法。我想不出你想要处理这个问题的其他方式。如果您可能正在讨论可为您的客户提供的付款选项,那么您的付款页面上就会有这样的硬编码。

希望这会有所帮助。请记住,不要让它比它需要的更复杂。

+0

感谢您的输入! – boatingcow

1

“在应用程序中”,你是指这些记录存在于文件系统中,可供应用程序访问吗?

这一切都取决于你正在建设的应用程序。有几件事情需要考虑,特别是当涉及到代码复杂性和性能时。虽然我没有足够的关于您的项目的信息来建议具体细节,但需要注意以下几点:

有两个可能的存储库可以提高代码的复杂性。这意味着可读性将下降,奇怪的错误将开始出现,难以追踪。在大多数情况下,使用最简单的解决方案可能有用,这对您最有利。如果你看看大的PHP/MySQL软件包,你会发现即使代码本身有很多默认值,数据几乎全部来自数据库。当您无法摆脱最简单的解决方案(即将所有文件存储在文件中)时,这可能是一个合理的策略。

沉重的数据库参与的一大缺点是性能。您应该一定要跟踪应用程序中任何典型代码路径的所有数据库调用。如果您严重依赖大量查询,则必须采用大量缓存。跟踪发生的所有事情,并牢记计算机为了满足请求而必须做的事情。让计算机的任务尽可能简单是你的工作。

如果您存储在数据库中的模板,再大的性能损失将是缺乏操作码复用和缓存。普通的Web主机环境编译一个PHP文件一次,然后保持它的字节码版本一段时间。这节省了后续的重新编译并大大加快了执行速度。但是,如果您将PHP模板代码填充到eval()语句中,则每次调用该代码时都必须重新编译此代码。

另外,如果你使用的eval()以这种方式,你允许用户编辑模板,你必须确保这些用户的信任 - 因为他们将有机会获得整个PHP环境。如果您正在使用其他路线并使用模板引擎,则可能会有更大的性能问题(但不是安全问题)。无论如何,请尽可能考虑缓存模板输出。

关于锁定机制:看来你在这里引入一个大的建筑问题,因为你现在必须使每个存储库(文件DB)了解记录禁地到另一个。我建议你完全重新考虑这个方法,但是如果你必须的话,我强烈建议你用一个单独的列标记记录(基于ID的东西听起来像是一场噩梦)。标准的方法是在DB中保留经典的DB形状的东西(这些将是用户帐户和其他东西,很适合放入表格中),并将配置,所有代码和模板事物保存在文件系统中。

+0

谢谢Udo。我已经编辑了文本,以便“在应用程序中”变成“硬编码” - 换句话说,不是从数据库的行中检索数组(或对象),而是将数组(或对象)写入代码。不是“默认”值 - 它们用于形成对象的蓝图 - 而是具有自己特定值的实际对象。 – boatingcow

+0

+1表示可维护性问题。 – cmbuckley

1

我认为在应用程序中保留一些固定值硬编码可能是解决此问题的好方法。在大多数情况下,它甚至会减少数据库服务器上的负载,因为有些不是所有的值都必须通过SQL检索。

但有些时候它可能会导致性能问题,主要是如果你要加入与您的硬编码值的数据库来值。在这种情况下,将所有值存储在数据库中可能会有更好的性能,因为所有值都可以由数据库服务器进行优化和处理,而不是从SQL查询中获取所有值并在代码中手动加入它们。

为了应对这种情况,你可以存储值的数据库,但插入和更新必须只是你的维护处理或升级程序。如果您更关心不要修改数据,则可以设置一个维护例程来检查数据库中的值是否与代码相同。在这种情况下,这个数据库表非常像硬编码值的“缓存”。并且,当您不需要将固定值与数据库值结合使用时,仍然可以从代码中获取它们,从而避免不必要的SQL查询(因为您确定它们的值相同)。

相关问题