何时对源代码中的数据进行硬编码,何时使用数据库以及何时使用Web服务?

时间:2015-11-06 22:54:36

标签: php database web-services storage data-storage

考虑下面的类,其中与产品及其组件相关的一些数据被硬编码到源代码中。

class ProductCharacteristics
{
    private $model;

    function __construct($model)
    {
        $this->model = $model;

        //Since there are several product models, 
        //we hardcode each model separately.
        //models are 50, 100, 200  

        //length
        $this->length[ 50] = array(5.5, 5.5, 5.5, 5.5, 5.5, 5.5, 5.5, 5.5, 5.5);
        $this->length[100] = array(5.5, 5.5, 5.5, 5.5, 5.5, 5.5, 5.5, 5.5, 5.5);
        $this->length[200] = array(5.5, 5.5, 5.5, 5.5, 5.5, 5.5, 5.5, 5.5, 5.5);

        //weights
        $this->weight[ 50] = array(20, 114, 50);
        $this->weight[100] = array(68, 192, 68);
        $this->weight[200] = array(68, 192, 68);    

        //descriptions
        $this->description[ 50] = array('3"', '3"', 6.50);
        $this->description[100] = array('6"', '6"', 6.50);
        $this->description[200] = array('6"', '6"', 6.50);

    }

    public function getLengths()
    {
        return $this->length[$this->modelNumber];
    }

    public function getWeights()
    {
        return $this->weight[$this->modelNumber];
    }

    public function getDescriptions()
    {
        return $this->description[$this->modelNumber];
    }
}

//instantiate:
$pc = new ProductCharacteristics(50);
$weight = $pc->getWeight();
print 'weight of component 1 is ' . $weight[0];
print 'weight of component 2 is ' . $weight[1];

问题1:

此类型的数据(很小,很少更改)应该编码(放置)到数据库中。为什么或者为什么不?我正在寻找的不只是一个是/否。寻找一点解释/历史/理由。

问题2:

我选择对其进行硬编码而不是将其放入数据库的原因是因为我的印象是,对于这么小的数据集,对数据库的调用是昂贵的,而且是令人望而却步的。如果我有2MiB这样的数据,我当然不会把它放到源代码中。但由于该集很小,我将其放入源代码中,并带来额外的好处,即如果任何数据更改,则在我的源代码控制存储库中跟踪更改。如果它发生在数据库级别,我将无法知道这一变化

我因此看到将其硬编码到代码中并不是什么大不了的事情"。我已经运行了代码,因此可以轻松访问包含数据的额外文件。

问题:这是一个很重要的问题"或者相对而言,并不是什么大不了的事情。如果相反编码数据库中的数据?也就是说,如果源代码中的硬编码数据是O(1),那么将它放入数据库的重要性是什么呢?

在{访问时间,开销}中与源代码中的硬编码数据类似吗? 我至少看到使用数据库作为O(2),因为我们必须使用外部程序,数据库系统来获取数据。

我可以提出一个案例,我也可以使用网络服务获取数据,但是把它放在O(3),因为它是一个外部系统,我们必须调用外部系统,并且还要权衡网络等待时间。

3 个答案:

答案 0 :(得分:2)

答案1

显然,永不改变的数据可以硬编码。

偶尔/很少更改的数据是在某些时候仍需要配置的数据。因此,它不应该是硬编码的,因为重新配置软件要比更新源代码/编译/重新部署容易得多。

回答2

对于99%的情况,将数据存储在数据库中并不是什么大问题。否则,他们为什么会存在?对于数据库访问,它涉及延迟/开销。如果您的数据库服务器与您的程序驻留在同一个OS实例上,那么就没有网络延迟,而且开销将取决于数据库设计和底层存储架构(RAM / HDD / SSD)的组合。对于大多数不涉及数百万/十亿规模的项目,使用任何通用数据库部署都可以。

答案 1 :(得分:2)

问题1:

您可以将查询使用的内容用于数据库/ DBMS。然后,DBMS可以将其用于优化,完整性和清晰度。

  • DBMS可以优化所有查询 例如:如果将ORM数据结构代码与数据库查询结合使用,那么DBMS可能必须循环检查两个表的叉积来检查权重$pc->getWeight(),而它可能通过加入{{{}来避免交叉产品1}}早些时候。例如:一些总是真实的可以告诉DBMS帮助它优化查询的事情是ProductCharacteristics(包括UNIQUE NOT NULL)和PRIMARY KEY约束。

  • 您可以通过SQL直接查询 all 数据库 否则,DBMS具有大多数数据和通用优化接口,但如果不编译应用程序代码,则无法查询涉及ORM数据结构。

  • 您可以简化ORM代码 由于ORM代码被转换为SQL查询,因此当您仅使用数据库时,可以使用ORM功能,否则这些功能将不可用。例如:通过SQL窗口函数计算权重的通用函数。

  • 您可以简单地查询与您的ORM数据结构不同的应用程序关系 例如:使用ORM数据结构很容易找到某个组件的权重,但不容易找到某个权重的组件。但是通过DBMS也同样简单。

  • 您可以更好地保持诚信 例如:DBMS表格式和/或完整性约束强制相当于使数组的长度相同。

关系模型旨在解决数据结构和层次数据库的这些问题。 (请仔细阅读。)使用它的力量。

问题2:

这是一个大问题。 (参见问题1。)

  如果改为编码,那么它是一个“大不了”还是相对“不大”   那个数据库中的数据?

  • 您的福利是有限的和限制性的 您正在考虑单独的特定小查询。鉴于DBMS存在于具有优化自动实现的任意查询。
  

我的印象是“为这么小的集合调用数据库   数据昂贵,而且令人望而却步“。

  • 放慢非平凡的查询 您正在保存一个小的(以DBMS术语)持续通信&由于DBMS优化受阻,大型查询的大型评估成本的小查询的评估成本。 DBMS通过统计信息知道表格很小。给定一个小表和查询,所有 DBMS 正在做的是只是循环遍历内存中的数组。(并阅读SARGability。)
  

带来额外好处,如果任何基准更改,则更改为   在我的源代码管理存储库中跟踪

  • 您正在介绍例外 您正在重用代码,但是,必须记录/跟踪所有其他数据。确实应该跟踪您的代码和数据库。一个好的DBMS既有更新日志记录,也有版本跟踪(包括代码)。用它。无论如何,您始终可以在源代码管理存储库中跟踪DBMS FOREIGN KEY脚本。
  

也就是说,如果源代码中的硬编码数据是O(1),那么什么是大的哦   将其放入数据库

     

我至少看到使用数据库作为O(2),因为我们必须参与   外部程序,数据库系统获取dat

  • 了解big-O。
    O(1)是O(2)是O(3)是常数。你的意思是O(1)具有不同的常数因子。额外的实施水平通常在最差的情况下保持不变,但最好更好,因为使用更大范围的信息进行优化。

现在考虑ORM数据结构是“过早优化”(“万恶之源”)。这种工程权衡遵循经验性怀疑,调查和示范,然后进行成本效益分析(包括机会成本)。

答案 2 :(得分:0)

我强烈建议将所有数据放在某种配置文件或数据库中。但是,对于使用硬编码的小数据没有限制,但这是我解释的方式..

我之所以这样说的原因是 - 无论数据有多大 - 无论大小,你最终都会编辑。

如果数据被硬编码到代码中,很可能最终导致代码质量不佳。

我最好的建议是做类似的事情,当然如果不是数据库..

将数据文件创建为“data.lengths.php”

<?php
    return array(
        50 => array(
             5.5, 5.5, // can have as many as you want..
        )           
    );

您也可以为其他人准备相同的数据文件。

接下来你可以在任何你想用它的地方使用它。

<?php

      $data['length'] = require_once(__DIR__.'/data.lengths.php'); // Assuming both files are in same directory.

现在,通过这种方式,您将获得良好的代码质量,同时您也不会强迫自己走很长的路。

我的2美分,希望这有帮助。