简介及相关资料:
假设我有一张存储人的身高和体重的表格,如下所示:
PersonTable < # ID int, Name varchar(50), Height double, Weight double >
身高以厘米为单位,体重以公斤为单位。
问题:
我的问题是关于存储身高和体重的计量单位。
我为解决这个问题所做的努力:
PersonTable < # ID int,
Name varchar(50),
Height double, $ HeightUnit_Id int,
Weight double, $ WeightUnit_Id int >
Units < #ID int, Desription varchar(20) >
HeightUnit_Id 和 WeightUnit_Id 是引用表 Units 中的 Id 的外键。
问题:
有没有比我上面提到的明显的解决方案更好的解决方案,因为我不喜欢两者(如果做得不好,EAV 会变得混乱,并且添加额外的“单位列”对我来说似乎是浪费空间)?
假设测量类型不会混合(即任何特定行不会混合“kg”和“inches”或“pounds”和“cm”),并且还假设这个问题的至少部分意图现在与此有关删除的相关问题(请注意,除非您有足够的代表点来查看已删除的项目,否则以下链接将不起作用: 处理具有常量部分的复合属性),然后您只需指出该行使用的测量系统。在此模型中,您将拥有一个
MeasurementSystem
外键到任何包含测量值的表的表。例如(使用 Microsoft SQL Server 语法):如果您将混合测量系统和/或如果您将允许多个测量单位,即使仅限于一个系统(即允许“mm”、“cm”、“m”),那么将需要有一个额外的层来处理粒度的增加,包括需要在表中的每个度量列有一个 FK 字段
Person
。(我可以调整上面的模型以适应这个,但在这样做之前会等待一些澄清)。或者,如果各种体重单位和身高单位的组合数量相当有限/有限,那么您可以改为使用每一行来表示一种可接受的组合(例如“cm & kg”、“m & kg”、 “毫米和公斤”/“英寸和磅”,“英尺和磅”)。然后“US”与“Metric”只是查找表每一行的属性。例如:
或者,如果需要跨不同测量系统的单位组合,那么我会使用单独的表格——每种测量类型一个:“WeightUnits”和“HeightUnits”。我不会在同一张表中混合身高和体重的单位(即不同行上的“kg”和“cm”)。例如:
在此模型中,任何给定表中的每种测量类型都有其测量单位查找表的个人 FK。
鉴于这个问题与设计有关,答案可能是相当固执的......
这是我对它应该如何设计的看法。;)
存储计量单位的表
你的人表...
然后是换算表
如果度量单位在度量转换表中没有针对特定其他类型单位的条目,则没有可用的直接转换。(例如,厘米 -> 英寸会起作用,但厘米 -> 小时不会..)以不同的单位显示您的测量值应该很容易。
您的测量单位可以是您想要的任何单位(距离/时间/等)......但您可能想要添加测量类型......不确定我是否会担心 - 取决于用例。
如果您的身高/体重测量单位确实是固定的,即身高=CMs,体重=KGs,我不会引入任何额外的列(或逻辑)来指定测量单位。相反,我要做的只是更改列名,例如
这样,我可以消除关于身高和体重列的测量单位的任何混淆。
这取决于您正在设计什么……规范化的 OLTP 系统将具有一个单独的度量(或某个此类名称)表,该表为每个可能的度量单位提供引用完整性和性能优化。
如果您在进行分析并且不经常处理单位并且进行较少的转换,则可以将其存储为属性。这仍然很少见——比如调查回复或房地产平方英尺等行业标准。但是在房地产中还有什么可以衡量和有意义的呢?平面图?现在我们有英寸......以及正方形和立方体。我们回到了标准化设计。
对于身高,有多种测量方法适用,并且在各种情况下都非常有意义。使用这样的设计可能是个好主意:
通过这样的设计,您现在可以轻松创建查找/转换表: