用于在mysql中为多个用户存储高度和重量(等)的数据结构

时间:2012-06-26 21:19:27

标签: mysql structure normalization

我正在尝试为我的localhost开发一个应用程序,我可以随时跟踪物理属性(ht,体重,体内水分,体脂等),以便与用餐计划等目的的热量摄入进行比较。这里是我现在拥有的:

DB surname
 TBL home
  memberID (tiny int, 1, auto increment, primary key)
  name (varchar, 30)
  gender (char, 1) ->value should be m or f, but this isn't defined anywhere
  birthdate (datetime)

用于存储物理数据随着时间的推移我考虑过一个包含三列主键(日期,人物,测量类型)的表,每列都有常规的单列索引,以便我可以查找所有条目日期或某人或测量类型。像这样:

DB surname
 TBL stats (or something to that effect)
  date (datetime, PK1, index)
  memberFK (tiny int, 1, PK2, index)
  type (varchar, 3, PK3, index) -> possible values should be ht | wt | fat | wat maybe others will also become necessary
  value (decimal, 4/1) -> store all values in nnn.n format in a particular system (ie metric) and do any conversions, add units, etc when the data is called

这似乎仍然会产生大量的冗余,因此我想到可能会将每个用户的度量值存储在自己数据库的表中,如下所示:

DB user1
 TBL stats
  date (datetime, PK1, index)
  type (varchar, 3, PK2, index)
  value (decimal, 4/1)

这似乎通过从外键(和表格中)中删除一个列来略微清除它,但也阻止我在此表和其他非用户特定的营养相关表之间使用外键。另一方面,我计划开发其他家庭主题的应用程序,其中包含一般数据和用户特定数据,所以如果有很好的方法在这样的数据库之间使用数据,这可能是最好的方法。

所以这些对我来说似乎都不对,但我对如何让它们变得更好感到茫然。我正在倾向于第二个例子,只要我能找到保持数据完整性的方法。请对您认为有用的建议发表任何评论。谢谢!

2 个答案:

答案 0 :(得分:2)

以下是我将如何做到这一点

DB healthstats
    TABLE user
        memberID (int*, auto increment, unsigned zerofill, primary key)
        name (varchar, 50)
        gender (char, 1) ->value should be m or f, but this isn't defined anywhere
        birthdate (datetime)

    TABLE reading
        readingID (int*, auto increment, unsigned zerofill, primary key)
        memberID (int*, FK: TABLE user)
        date (datetime)

    TABLE stat
        statID (int*, auto increment, unsigned zerofill, primary key)
        readingID (int*, FK: TABLE reading)
        type (varchar, 3)*
        value (decimal 4.1)*

*这些数据类型取决于您的意义,只需确保主键和外键匹配。

stat是一种测量值(例如身高,体重,体脂等)。reading定义为同时进行的一项或多项stat测量。

请注意,这一切都在同一个数据库中,它包含三个表。

答案 1 :(得分:0)

拥有多个具有相同结构的表几乎总是一个坏主意,因为它会阻止您以规范形式从多个这样的表中访问数据。假设您想要夏季和冬季之间的平均重量差异,那么如果您按用户分割它们,则必须遍历所有表格。

我不确定你在哪里看到“超额冗余”。但是,对于具有各种参数作为列而不是枚举列的值的表,您可能会更舒服。即介绍ht,wt,fat,wat以及你可能需要的任何其他内容。这样,您不会将所有这些值限制为单个数字类型,也不会在同一列中存储完全不相关的单位的值。您仍然可以使用NULL作为缺失值,因此如果不是您要强制执行的策略,则不会强制您始终提供所有值。因为整个集合都有日期,而人只出现一次,所以只有你通常对一个人做多个读数才有意义。