考虑下面的类,其中一些与产品及其组件相关的数据被硬编码到源代码中。
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];
问题一:
是否应该将这种类型的数据(小的、很少更改的)编码(放置)到数据库中。为什么或者为什么不?我要寻找的不仅仅是一个是/否。寻找一点解释/历史/基本原理。
问题 2:
我选择硬编码而不是将其放入数据库的原因是因为我的印象是“为这么小的数据集调用数据库是昂贵的,而且令人望而却步”。如果我有 2MiB 的此类数据,我当然不会将其放入源代码中。但由于该集合很小,我将其放入源代码中还有一个额外的好处,即如果任何数据发生变化,我的源代码控制存储库中会跟踪该变化。如果它发生在数据库级别,我将无法知道更改
因此,我认为将其硬编码到代码中“没什么大不了的”。我已经运行了代码,因此可以轻松访问一个仅包含数据的额外文件。
问题:如果改为在数据库中对该数据进行编码,这是“大事”还是相对“没什么大事”?也就是说,如果源代码中的硬编码数据是 O(1),那么将它放入数据库中有什么大不了的呢?
它在{访问时间、开销}方面是否与源代码中的硬编码数据相似? 我至少将使用数据库视为 O(2),因为我们必须使用外部程序,即数据库系统来获取数据。
我可以证明我也可以使用 Web 服务获取数据,但将它放在 O(3) 中,因为它是一个外部系统,我们必须调用外部系统并且还需要网络权重延迟。
最佳答案
答案 1
显然,可以对永不更改的数据进行硬编码。
偶尔/很少更改的数据是在某些时候仍需要可配置的数据。因此,不应对其进行硬编码,因为重新配置软件比更新源代码/编译/重新部署要容易得多。
答案 2
对于 99% 的情况,将数据存储在数据库中并不是什么大问题。否则,它们为什么会存在?对于数据库访问,它是关于延迟/开销的。如果您的数据库服务器与您的程序驻留在同一操作系统实例上,则没有网络延迟,并且开销将取决于您的数据库设计和底层存储架构(RAM/HDD/SSD)的组合。对于大多数不涉及数百万/数十亿规模的项目,使用任何通用数据库部署都可以。
关于php - 什么时候在源代码中硬编码数据,什么时候使用数据库,什么时候使用网络服务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33576980/