是否应始终使用特定单位(例如米)将值存储在数据库中,还是应将该单位设置为附加字段?

时间:2009-08-27 17:24:26

标签: database-design

是否应始终使用特定单位(例如米)将值存储在数据库中,还是应使用附加字段或表格设置单位?

示例1:作为字段的一部分定义的单位

buildings
-----------------------------
building_id       INT
date_built_utc    DATE
reported_area_m   DOUBLE

示例2:在另一个字段中定义的单位

buildings
-----------------------------
building_id          INT
date_built           DATE
date_built_unit      VARCHAR(50)
reported_area        DOUBLE
reported_area_unit   VARCHAR(50)

我非常倾向于示例1 ,因为如果有一个标准单位用于存储数据,则报告值会更容易(并且更不容易出错)。如果需要,应用程序层可以轻松处理单元之间的任何转换。

哪种方法更受欢迎?为什么?

9 个答案:

答案 0 :(得分:9)

我认为允许不止一个单位会引起很多混乱和维护问题。你能想象有人读100并且想而不是英尺吗?毕竟,这就是造成the loss of a NASA orbiter的原因。

编辑:我的意思是,无论如何,如果你可以强迫一个单位,那就去做吧。这样可以防止对单位的任何可能的混淆。

答案 1 :(得分:4)

示例1 是要走的路。如果您需要在reporting_area字段上编写使用SUM或AVG的SQL查询,请考虑在需要考虑单位列时会有多痛苦。

另外,我认为在列名本身中包含单位(米,英尺等)没有任何问题。事实上,这是一个好主意,因为数据库中的其他任何地方都不会显示该单位。

答案 2 :(得分:3)

请注意使用单个设备时出现下溢和溢出问题:请勿在{{1​​}}中存储平方皮米。请务必为您要存储的值范围选择合理的基本单位。

答案 3 :(得分:1)

这取决于您的测量精确度,以及用户想要使用不同单位的值的频率。无论哪种方式,您的代码都需要能够在您的用户想要的所有单位之间来回转换(例如,m ^ 2,ft ^ 2,英亩等)。在我工作的科学数据集中,我们总是在保存到数据库之前转换为通用单位。我们不会这样做的唯一情况是,如果测量结果非常精确(例如地球的大小到最接近的毫米),则转换可能会引入舍入误差。对于你的情况(米与英尺,大小可达几千米或几英尺,大概是?)圆角误差没什么大不了的,它们之间的转换是一个快速线性操作,所以我希望以米为单位存储所有内容足够的。

无论哪种方式,你都需要记录你所做的任何事情,以便没有人会错误地将这些值视为错误的单位。

答案 4 :(得分:1)

我们这里没有人对你的项目有同样的洞察力,这个(以及许多其他案例)中的最佳答案是 - “它取决于”,很少有任何削减&对此类问题的干燥,普遍接受的答案。你必须根据你的目标是什么以及合理来做出你的选择。

如果您选择特定的行动方案,轮询社区是了解您的选择以及未来可能存在哪些陷阱的好方法,但明确的答案可能超出我们的范围。

正如这里的几位人士指出,如果你走在存储多种测量类型的道路上,那么你还有责任跟踪如何在它们之间进行转换,以及在转换这些值时是否可以接受舍入误差。 / p>

从维护的角度来看,将所有东西存放在标准单元中肯定是理想的,因为它使前端和后端都更简单。后端 - 如果您需要以不同的方式表示数据,您可以在从数据库中提取数据时将其转换为或在进入之前进行转换...但它是否符合您的用户要求?

答案 5 :(得分:1)

我喜欢将单位存储在列的名称中:

FileSizeInBytes
TimeSpanInSeconds
WidthInCentimeters

答案 6 :(得分:0)

首先,不要将信息存储在字段名称中,我认为这不是最佳实践

我会创建一个查找表并执行

 buildings
 -----------------------------
 building_id       INT
 date_built        DATE
 date_unit         INT
 reported_area     DOUBLE
 reported_unit     INT

为什么查找表,非常简单。

为什么要复制1000x米,而只能使用数字1

答案 7 :(得分:0)

你的问题的答案是另一个问题:我如何找到面积至少为x但不超过y的所有建筑?

答案 8 :(得分:0)

如果您可以在转换时遇到舍入错误,那么使用公共单元肯定是要走的路,因为其他人给出的所有原因。

这是一个很大的潜力“如果”,但必须加以考虑。

像许多问题一样,答案是“好吧,一切都取决于......”