优化我的数据结构.处理大量的单位和转换


Optimizing my data structure. Dealing with lots of units and conversions

我的网站涉及很多药物剂量和单位。目前,它的设置并不是很灵活,不能根据用户将这些剂量和单位塑造成不同的值。

例如,如果一个用户提交了一个记录,他周一喝了1ml酒,周二喝了10ml,周二喝了2l,那么同样的物质使用了两个单位。那么,如果我想用mL向用户显示这三天的平均值,会发生什么呢?如果用户只希望看到以升为单位的数据呢?

这是我到目前为止写的。

 drugs
 id | drug
 1  | alcohol
 2  | cannabis

 units
 id | unit
 1  | ml
 2  | mg
 3  | g
 4  | l

 unit_conversion
 id | from_unitid | to_unitid | multiplier
 1  | 1           | 4         | 1000
 2  | 4           | 1         | .001
 3  | 2           | 3         | 1000
 4  | 3           | 2         | .001
 user_dose_line
 id | drug_id | unit_id | dose
 1  | 1       | 1       | 100
 2  | 1       | 1       | 200
 3  | 1       | 4       | 1

这是我理想的工作方式。

用户提交一条记录。他填写药物是酒精,剂量是100,单位是ml。在数据库表中存储的是user_dose_line上的id#1。

现在假设有另一个表。这是一个选项表,用户可以在其中设置他想要使用的默认度量单位。

 user_dose_options
 id | user_id | drug_id | unit_id
 1  | 22      | 1       | 4

这表明用户已选择任何含有酒精的条目都应始终转换为升。

这是我的问题,在我的逻辑中我做这些转换的地方。

我使用CAKEPHP,这是一个常见的MVC框架。我应该在模型中进行转换吗?在控制器中?最好的做法是什么?我是否选择了最优化的路线?

我计划稍后为单位/剂量添加更多功能,因此我需要以最有效的方式设置数据库,以便我可以对数据进行大量很酷的计算(显示图形,统计等)

应该有一个输入和一个输出方法。它们应该从输入单元转换为用于存储数据的标准单元。你可以在模型的setter中这样做。例如

class userInTake {
  private $userId; 
  private $drugId;
  private $dose;
  public function setDrugUse($drugId,$dose,$unitId) {
    // $convert dose to you default unit for this drug
    $this->dose   = yourConversionMethod($dose,$unit,$desiredUnit);
    $this->userId = $userId;
    $this->drugId = $drugId;
  }
  ...
}

在将用户输入存储到模型中时,进行转换。例如,如果一个用户输入他周一喝了4l酒,你可以将升转换成ml,然后存储ml的值。如果一个用户输入了三次,星期一41,星期二40ml,星期五24,41,你把每个输入都转换成ml。当显示平均值时,您将得到6440ml。

您的输出函数可以选择最适合显示值的单位(例如,如果ml值> 10000,则显示为升)。

这样你就不需要存储不同的单位,只需要在输入/输出时转换你的单位。这应该会使计算变得容易得多。

理想的设置是任何与数据相关的操作都应该在模型中。您可以覆盖afterFind()方法,以便在查询之后立即进行转换,并准备好使用数据。

http://book.cakephp.org/2.0/en/models/callback-methods.html afterfind

记住这个理念:胖模特,瘦控制器。