美制公制:转换汇总或单独转换?

时间:2018-01-04 15:18:00

标签: c# sql-server-2008 tsql precision

我正在开发一个程序,允许用户以公制或美制单位输入测量值并将其存储在数据库中。

稍后,应允许用户检索多个测量值的总和并以任一单位显示。

我的问题是哪种做法最好?

  1. 在数据库中,记录用户输入的测量值和他们输入的单位。在检索时,将两个单元的条目相加并转换不需要的单元,然后再将它们加在一起。

  2. 仅在数据库中存储单个度量单位。在存储之前,用户将每个条目转换为所需的单位。根据请求,检索所有值的总和,并按原样转换或显示。

  3. 数学上我意识到,因为转换只涉及乘法,而且:

    ax + ay + az = a(x + y + z)
    

    它不应该有所作为,但是,有一个原因,它被称为计算机科学而不是计算机数学。我不禁感觉方法2为浮点数学错误引入了更多的要点。我只是因为多年的Python编程而偏执狂?

    更多信息:

    • 允许输入的最大小数精度为4
    • 数据库将值存储为Decimal(20,6)
    • SQL Server 2008
    • 数据输入页面可能是带有C#代码隐藏的ASP.Net

2 个答案:

答案 0 :(得分:2)

对于此类项目,我们应该采取一种分离关注点的方法。我建议只在数据库中存储单一测量值。数据库毕竟只是一个数据仓库,仅此而已。

您应该让应用程序执行业务逻辑。我建议使用工厂为每个单元生成测量值。

简单明了,数据库应该只存储数据而应用程序只应该执行业务逻辑。

答案 1 :(得分:2)

我建议单独存储SI中的测量值。如果将它们存储在原始单位系统中,则需要更多数据来规范地表示每个测量。这是因为其他单位系统对特定数量的单位有多个选择。因此,如果不是在SI中,体积可能是立方英尺,立方英寸,品脱,夸脱,加仑,桶,英亩 - 英尺,谷仓 - 百万分量或液体盎司(而在SI中只有一种选择)。

你还应该意识到“你在测量什么”和“它所表达的单位”是完全不同的概念 - 一个是语义,另一个是语法。

不要丢失测量的语义 - 例如,如果您正在测量液体体积,请将该事实与您存储的值一起存储。否则,您可能会遇到在单位系统之间转换的问题(例如,在SI中,所有体积均为m ^ 3,但在美国英制单位中,气体体积通常与液体体积不同),并且您失去了能力告诉他们添加它们是否有意义......

当然,如果您确定只有总和才会有意义,那么您应该只存储总和,因为单个数据点将占用更多空间。但我仍然建议存储SI。