我正在尝试为我的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)
这似乎通过从外键(和表格中)中删除一个列来略微清除它,但也阻止我在此表和其他非用户特定的营养相关表之间使用外键。另一方面,我计划开发其他家庭主题的应用程序,其中包含一般数据和用户特定数据,所以如果有很好的方法在这样的数据库之间使用数据,这可能是最好的方法。
所以这些对我来说似乎都不对,但我对如何让它们变得更好感到茫然。我正在倾向于第二个例子,只要我能找到保持数据完整性的方法。请对您认为有用的建议发表任何评论。谢谢!
答案 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
作为缺失值,因此如果不是您要强制执行的策略,则不会强制您始终提供所有值。因为整个集合都有日期,而人只出现一次,所以只有你通常对一个人做多个读数才有意义。