2010-09-20 40 views
0

我正在使用LAMP网络应用程序,它使用不同的度量单位管理大量数据。这个php应用程序使用一个自定义的MVC框架。我们现在有不同国家的客户,我们希望为客户提供公制,英制或组合的选择。如何在PHP Web应用程序中管理度量单位?

目前,所有数据都以国际单位保存在我们的MySQL数据库中。一些表格有多列包含不同单位的数据。管理客户(用户)所选单元中所有数据的显示的最佳DB架构是什么?

是否有任何PHP类,PHP函数或Web服务可以帮助我们?

谢谢!


UPDATE:

如果我决定使用UnitConverter像Zend框架类,这将是确定的单位,我有我的数据库中的每个数据的最佳方式是什么?

  • 新表“measurement_unit”包含每个数据类型,我在我的数据库中有测量类型?
  • 我应该在数据库中添加一个新的“measurement_type”列吗?
+1

严格遵循MVC框架,您可能需要一个名为measurement_units的新表,其中包含type_id和type_name。然后,您的user_pref(或user)表中将会有一个measurement_type列。在该列中,您将存储用户的type_ids。这样你的所有数据都在数据库中。但是,由于测量类型数量非常有限,而且您不可能经常更改它们,所以我只需在库中定义测量类型(define('METER',1);)并存储一个字符串(' METER')放在user_pref(或user)表的一个measurement_pref列中。 – clumsyfingers 2010-09-21 12:31:10

+1

在上面的第一个更具可扩展性,而第二个更高效的速度。我还会注意到,如果您想将您的框架移动到另一个项目中,首先您需要将您的measurement_units表和您的库一起移动,并且在移动时它可以独立运行。哦,你也可以将你的定义保存在模型或配置文件中,这可能是最好的解决方案。如果将其保存在全局配置中,可能需要使用前缀命名空间。 – clumsyfingers 2010-09-21 12:39:17

+0

感谢您的回答!为我的应用程序中每个数据保存测量单位的最佳方法是在user_pref表的单个“measurement_type”列中保存测量单位的最佳方法是什么?在我的应用程序中声明每个数据的度量单位的最佳方式是什么,而不会过度添加具有太多列的模式? – benjisail 2010-09-22 10:14:25

回答

4

问题的解释有点模糊,我不知道该应用程序的范围,但是从系统架构来看,如果您正在使用MVC框架,您可能希望保持所有数据库单位相同并创建一个UnitConversion控制器。该控制器将采用标准单位作为输入,并根据所需单位输出一个值。您的用户/客户端记录中会保留一个标志,让您知道他们喜欢哪个单位,这样您就不会在登录之间丢失这些信息。将标准单位格式的值(比如米)和所需单位的标志(比如'FEET')传入控制器,让它进行转换并返回一个值。

我不会尝试在数据库中保留不同的单元类型,因为您可能最终会编写各种代码来尝试管理异常和维护(例如,在客户端更改其单元时更新所有值)。在数据库中保留一个标准单元,并通过类似于Robert提到的Zend框架的php类来完成转换。谷歌搜索“PHP单位转换”将带来一些可能满足您的需求的类。

ON UPDATE:

仍不能确定我看到了整个问题,但我会尽力回答是最好的,我明白了。像以前一样,最好在数据库中保留1个单位系统,比如说,度量。 user_pref中的measurement_type告诉客户想要什么,说'IMPERIAL'。这取决于如何摊开你的数据库是你可以选择两种解决方案之一保存值:

  1. 对于您的数据库项目,你可能有不同的属性(列),如体重,身高,体积等

  2. 您可能有一个包含项目的项目表。然后你有一个拥有属性的Property表。属性表有4列:property_id(主键),属性(HEIGHT,WIDTH,LENGTH,WEIGHT),property_type(SIZE,MASS,VOLUME,AWESOMENESS)和值。然后你有一个Property_Lookup表,它有两列:item_id,property_id和这三个表之间的连接将给你属于一个Item的每个属性的所有值和单位类型。在这个模式中,我仍然保留单个单位系统中的'值'列中的所有条目(在此示例指标中)。有关多对多关系的更多信息,请参阅此链接(http://www.tomjewett.com/dbdesign/dbdesign.php?page=manymany.php)。

您的模型将检索数据并将这些属性封装在Unit {system(METRIC *,IMPERIAL,BOTH);类型(尺寸,质量,体积);价值}迷你型号。把它传给你的控制器。在呈现您的视图时,您会希望基于客户端所需的单位值,因此,当您的控制器将视图的数据放在一起时,它将通过UnitConversion库发送单元对象。 UnitConversion库将检查客户端首选系统的用户模型和单元模型中的“系统”,并进行必要的转换(因为库可以假设来自数据库的单元模型中的系统是度量标准,所以它使步骤更简单)。然后,它将以正确的单位输出一个数字(如果选择BOTH,则为单位),这可以传递给视图。

上面的一句话是,总是在系统架构中处理问题时没有“正确”的解决方案。这就是我如何根据所提供的信息来组织事物的方式,但是您可能需要对它进行相当程度的调整才能使其与您正在处理的内容完全吻合。也就是说,我会调整上述内容以适应您的系统,而不是调整您的系统以实现上述功能!希望这给你一些好点子。

+0

谢谢,这是我的问题的PHP方面的一个很好的答案。现在我只需要在数据库方面提供一些帮助。 – benjisail 2010-09-21 08:54:39

+1

“控制器”不是所用类的类型,但“库”会更合适 – RobertPitt 2010-09-21 09:12:34

2

请看一看了Zend组件Zend_Measure

+0

我已经有了一个我不想更改的自定义MVC框架。但是,除了框架之外,我可以使用Zend Framework作为大型库吗?就像那样,我可以直接使用Zend_Measure组件。 – benjisail 2010-09-21 11:35:09

+1

如果你的PHP安装了Zend Framework,你可以执行'Require_once'Zend/Loader.php';'然后跟着'Zend_Loader :: loadClass('Zend_Measure');'这会加载你需要的文件Zend Measure类! – RobertPitt 2010-09-21 11:43:08

相关问题