我正在创建一个存储用户统计数据的系统,如下所示:
Table Stats =========== id name ----------- 1 height 2 weight 3 eye_colour 4 etc...
Table Stat_Options ================== id stat_id name 1 1 170cm 2 1 172cm 3 1 174cm 4 2 60kg 5 2 65kg
我将stat_options的ID存储在用户表中,如下所示:
Table User_Stats ================ id user_id height weight eye_colour etc... --------------------------------------------------------- 1 10 3 5 7
存储ID的原因是,stat_option的'name'总是可以改变,用户记录也不需要改变。
但是看着这个我觉得它可能会出现问题,特别是在搜索时。例如,如果我想搜索两个特定高度之间的所有用户?我想到的一个解决方案是在Stat_Options表中插入一个'value'字段,但我仍然不确定它是否有用。有什么建议吗?
答案 0 :(得分:1)
恕我直言,你应该使用像Stat_Options
这样的查找表,仅用于属性具有有限数量值的情况,例如眼睛颜色。尝试使用像这样的表格(理论上)具有无限数量的值,如身高和体重,正如您已经猜到的那样,会引起严重的麻烦。我会将这些值直接存储在User_Stats
表中。
答案 1 :(得分:1)
此类设计的问题在于您在Stat_Options
表中混合定量值(高度,重量)和定性值(eye_colour)。如果您绝对想要这一点,请将定量和定性值分解为2列。
Table Stat_Options ================================== id stat_id name value unit === ======= ===== ===== ===== 1 1 170cm 170 cm 2 1 172cm 172 cm 3 1 174cm 174 cm 4 2 60kg 60 kg 5 2 65kg 65 kg 6 3 black NULL black
然后与其他建议的JOIN
表一起获取值BETWEEN x AND y
。
答案 2 :(得分:0)
从您的示例中,您是否可以通过查询来获得x和y之间高度的所有用户:
Select user_id from User_Stats where User_Status.height between x and y
答案 3 :(得分:0)
SELECT user_id FROM User_Stats WHERE height BETWEEN 170 AND 172;
我猜那个。
但是对于表格的结构,我可以建议如下:
不需要Stats表,因为它可以包含在User_Stats表中没有问题。这样,您可以更好地规范表格的使用情况。
IF并且只有当身高和体重的值可以超过你所拥有的3时(例如180,183,192,200,110 ......),我建议与第1点相同。删除表并包含在User_Stats表中,因为此值可以更改,并且实际上不需要为此创建新表。这样,您可以更快速,更轻松地在单个表格中比较您想要的任何内容。
答案 4 :(得分:0)
这样做不是一个好主意。使用Stat_option来绑定下拉列表例如,如果你有一个从不经常更改值的数字..
为什么不用整数字段向User-stats表中添加高度?
但如果你真的想要你能做到:
SELECT * FROM USER_STATS
INNER JOIN STAT_OPTION
ON USER_STATS.height in (
SELECT ID FROM Stat_Options
WHERE NAME BETWEEN 170 AND 175)
或类似的东西,我不习惯使用MySql ..