0

我正在尝试为我的本地主机开发一个应用程序,我可以在该应用程序上跟踪一段时间内的身体属性(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)

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

所以这些对我来说似乎都不对,但我不知道如何让它们变得更好。我倾向于第二个示例,前提是我可以找到保持数据完整性的方法。请对您认为有帮助的建议提出任何意见。谢谢!

4

2 回答 2

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)*

*这些数据类型由你决定,只要确保主键和外键匹配即可。

Astat是测量值(例如身高、体重、体脂等)。Areading定义为同时进行stat的一个或多个测量值。

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

于 2012-06-26T21:39:54.337 回答
0

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

我不确定你在哪里看到了“过度冗余”。但也许您会更喜欢将各种参数作为列而不是枚举列的值的表。即引入列 ht、wt、fat、wat 以及您可能需要的任何其他列。这样,所有这些值就不会被限制为单一的数字类型,并且不会将完全不相关的单位的值存储在同一列中。您仍然可以使用NULL缺失值,因此如果这不是您要强制执行的策略,您将不会被迫始终提供所有值。由于整个集合的日期和人物只出现一次,因此只有在您通常对一个人进行多次阅读时才有意义。

于 2012-06-26T21:47:15.940 回答