保存用户的身高和体重

时间:2011-07-06 04:38:27

标签: mysql database database-design

我应该如何在MySQL数据库中存储用户的身高和体重,以便我可以使用这些信息来查找特定身高或体重的用户?此外,我需要能够以英制或公制系统显示此信息。

我的想法是存储高度以厘米为单位的信息和以千克为单位的重量(我更喜欢英制的公制)。我甚至可以让用户输入他们的信息和英语系统,但在保存之前转换为公制。我认为在SQL中可以很容易地将公斤转换成磅数,但我不确定将178厘米转换为5'10"(略微向下舍入)是多么容易。

我应该在数据库中保存英语和指标值,这样我在查询时就不需要进行转换了吗?对于存储派生/计算值而言,这听起来不错。

4 个答案:

答案 0 :(得分:6)

有几种方法......一种是只有两个数字列,一个用于高度,一个用于重量,然后在显示时进行转换(如果需要)。另一种方法是创建一个“高度”表和一个“权重”表,每个表都有一个从另一个表链接的主键。然后,您可以在这些表中存储英语和公制值(以及您想要的任何其他元信息):

CREATE TABLE height (
    id          SERIAL PRIMARY KEY,
    english     VARCHAR,
    inches      INT,
    cm          INT,
    hands       INT  // As in, the height of a horse
);

INSERT INTO height VALUES
    (1,'4 feet',           48, 122, 12),
    (2,'4 feet, 1 inch',   49, 124, 12),
    (3,'4 feet, 2 inches', 50, 127, 12),
    (3,'4 feet, 3 inches', 51, 130, 12),
    ....

你明白了......

然后,您的用户表将引用高度权重表 - 可能还有许多其他维度表 - 占星符号,婚姻状况等。

CREATE TABLE users (
    uid         SERIAL PRIMARY KEY,
    height      INT REFERENCES height(id),
    weight      INT references weight(id),
    sign        INT references sign(id),
    ...
);

然后搜索4到5英尺之间的用户:

SELECT *
FROM users
JOIN height ON users.height = height.id
WHERE height.inches >= 48 AND height.inches <= 60;

这种方法有几个优点:

  • 你不必复制“努力”(好像是任何实际工作)来进行显示转换 - 只需选择你想要显示的格式!
  • 它使HTML选择中的下拉框变得非常容易 - 例如SELECT english FROM height ORDER BY inches
  • 它使您的各种维度的逻辑 - 包括非数字维度(如占星标志)明显相似 - 您没有为每种数据类型提供特殊的案例代码。
  • 它很好地扩展
  • 可以轻松添加数据的新表示形式(例如,将“指针”列添加到高度表中)

答案 1 :(得分:3)

我会按你所说的方式去做,但是在转换部分,你不会将178厘米转换为5英尺10英寸,你可以将其转换为70英寸,然后如果需要的话,将其转换为5'10“。

答案 2 :(得分:1)

将5'10“视为70”或5.8333333'。在这种情况下,转换为70“或5.83333只是一个乘法,所以如果您愿意,它很容易以db为单位存储在数据库中。

用户看到的问题是演示文稿问题,与数据库无关。

答案 3 :(得分:0)

我同意在这种情况下存储计算值是不正确的。你的选择是完美的。

但是,我会在应用程序级别进行计算并使用这些值查询数据库 - 这取决于您的应用程序编写的语言,我相信有很多o库/模块可以计算这些转换

编辑 - 解决在DB中存储计算值的问题:

虽然这在使用DB时被认为是一种不好的做法,但我通常不会100%反对这种做法 - 只有90%。

我倾向于仅在计算复杂时将计算值存储在DB中,并且需要大量资源才能获得所需的结果 - 这显然是的情况。

如果你在这里存储计算值,你将只有这种技术的缺点 - 修改记录时,你必须在多个地方修改数据以保持数据库的一致性