我正在创建一个应用程序,用户将输入项目尺寸,如宽度、高度、深度和项目的重量。
public class ItemDimensions{
public int width {get;set;}
public int height {get;set;}
public int depth {get;set;}
public int weight {get;set;}
}
第一个问题是,在数据库中存储这些维度的最佳值类型应该是什么?int字符串双小数点..?
在用户界面上,用户可以选择输入详细信息的维度类型。例如,他们可能选择输入厘米或英寸。对于体重,他们可能选择进入公斤gr或石头等。处理这个问题最好的办法是什么?理想情况下,我只存储一个值,而不是为每个不同维度类型创建额外的列。
我自己的方法是创建一个dimensionType表,当用户选择维度时,让我们将宽度、高度和深度作为cm表示,它将保留外键、维度的类型,并存储数据。然后让我们说,如果用户想要查看它的英寸,它将检查数据的类型,并转换它。这是一种正确的方法来处理这些维度数据,还是有更好的方法来处理这些数据?
发布于 2013-12-04 17:27:29
通常经验法则是以标准化格式存储数据,无论是长度/宽度/高度/体重,还是日期/时间信息。如果您需要不同的单位或格式(或时区),在存储数据之前进行一些转换,以便您知道数据是可靠的、可用的格式。
度量由两个信息组成:一个值和一个单位说明符。如果希望用户在输入值时能够选择单位,则必须决定是否要将计量存储为原始值、单位格式或将输入的数据转换为标准化单位,并只存储转换后的值。
例如,假设我输入了一个长度值1.5 inch
。您可以将值存储在两个字段中(例如LengthValue
和LengthUnit
),或者决定将值转换为标准单元(例如米),并将其存储在一个带有0.0381
值的Length
字段中。如果用户希望再次看到该值,您可以以米为单位给他,或者使用您的转换方法将其转换为她选择的单位。
数据的标准表示的优点是可以对数据提出简单的问题,例如:“有多少项的长度在150毫米至300毫米之间?”:
SELECT COUNT(*)
FROM Items
WHERE Length BETWEEN 0.150 AND 0.300
或者,体积小于1立方米的所有物品的平均重量如何?
SELECT AVG(Weight)
FROM Items
WHERE (Length * Width * Height) < 1
如果您想存储值,那么您需要一个转换表来问这些问题:
SELECT COUNT(*)
FROM
(
SELECT i.LengthValue * c.Factor AS Length
FROM Items i
JOIN Conversion c ON c.FromUnit = i.LengthUnit
WHERE i.ToUnit = 'm'
) l
WHERE Length BETWEEN 0.150 AND 0.300
更复杂的是:
SELECT AVG(WeightKg)
FROM
(
SELECT i.LengthValue * lc.Factor AS LengthM,
i.WidthValue * wc.Factor AS WidthM,
i.HeightValue * hc.Factor AS HeightM,
i.WeightValue * mc.Factor AS WeightKg
FROM Items i
JOIN Conversion lc ON lc.FromUnit = i.LengthUnit
JOIN Conversion wc ON wc.FromUnit = i.WidthUnit
JOIN Conversion hc ON hc.FromUnit = i.HeightUnit
JOIN Conversion mc ON mc.FromUnit = i.WeightUnit -- 'm' for 'mass'
WHERE lc.ToUnit = 'm' AND wc.ToUnit = 'm' AND hc.ToUnit = 'm'
AND mc.ToUnit = 'Kg'
) d
WHERE (LengthM * WidthM * HeightM) < 1
似乎是一个人为的例子,但我在生产中见过这样的代码。
这不仅是丑陋的代码,它是非常低效率。即使将单元说明符作为索引存储到单元表中或作为索引存储到转换表中,查询复杂性仍然太高。
这里的缺点是,如果允许数据库中的不同单元,则必须对每个使用这些值的查询执行这种操作。即使您知道数据库中的每个当前长度值都是在m
中输入的,也不能保证总是这样。
发布于 2013-12-04 17:08:51
我会采取和你一样的方法。您可以将项目与其类型一起存储在主表中。您的模型对维度使用int
,但也允许十进制值--在Server中存储它的最佳类型是decimal
。
你可以有主桌
Item table
--
... -- other fields
Width decimal(38,6) -- you can decide on precision
Height decimal(38,6) -- you can decide on precision
Depth decimal(38,6) -- you can decide on precision
DimentionTypeId int FK -- the 3 above would use the same dimention type?
Weight
DimentionType table
--
DimentionTypeID int PK
Description
... -- other fields
您可以在应用程序中使用DimentionType
进行查找(例如,使用维度类型填充组合框)。
https://stackoverflow.com/questions/20389223
复制相似问题