如何设置MySQL表以跟随变量随着时间的推移?

时间:2011-02-09 02:39:48

标签: mysql database-design

我的网站上有几个注册用户。

用户保存在单个表'users'上,为每个用户分配一个唯一ID。

我想让我的用户跟踪他们的费用,行驶里程,温度等。

我不能确定每个用户在登录时都会为所有可跟踪变量输入一个值 - 所以可能会发生的一个例子是:

'example data'
user     date         amount    miles     temp    etc
1        3/1/2010     $10.00    5         54
2        3/1/2010     $20.00    15          
1        3/12/2010              5         55
1        3/15/2010    $10.00    25        51
3        3/20/2010                        45
3        4/12/2010    $20.00    10        54

为这种情况设置表格的最佳方法是什么?

我应该在注册时为每个用户创建一个独有的表吗? (最终可能会有数以千计的用户专用表格)

'user-1 table'
date         amount    miles     temp    etc
3/1/2010     $10.00    5         54
3/12/2010              5         55
3/15/2010    $10.00    25        51

'user-3 table'
date         amount    miles     temp    etc
3/20/2010                        45
4/12/2010    $20.00    10        54

and so on...

我应该创建一个与上面的示例数据基本相同的表吗? (可能最终得到一个需要梳理的巨大表来查找具有所请求用户ID的行)。

'user data table'
user     date         amount    miles     temp    etc
1        3/1/2010     $10.00    5         54
2        3/1/2010     $20.00    15          
1        3/12/2010              5         55
1        3/15/2010    $10.00    25        51
3        3/20/2010                        45
3        4/12/2010    $20.00    10        54

有什么建议吗?

2 个答案:

答案 0 :(得分:1)

不,只需创建一个包含所有可能可空字段的表格。如果用户没有填写该参数 - 那么只需保留NULL值。

  

可能最终会出现一个需要梳理的巨大表格来查找具有所请求用户ID的行

是的,如果您要为user_id字段指定索引(对于WHERE user_id = 42等查询),查询将足够快

答案 1 :(得分:1)

构建数据库是为了处理与集合相似的数据。

您想要的是单个用户数据表,同一个表中的多个用户按user_id分割。您可能希望进一步规范化,以便它存储:

user     date         type      units
1        3/1/2010     dollars   10.00
1        3/1/2010     miles     5
1        3/1/2010     temp      54
2        3/1/2010     dollars   20.00
2        3/1/2010     miles     15          
1        3/12/2010    miles     5
1        3/12/2010    temp      55
etc

如果用户+日期进行特定旅行,则更进一步

trip-table
tripid    user     date
========= ======== =========
1         1        3/1/2010

type-table
typeid    description
========= ============
1         dollars
2         miles
etc

trip-data
tripid     type      units
=========  ========  =======
1          1         10.00
1          2         5
etc

然而,如果您将始终(或几乎总是)在输入的表单中显示您的数据,并在所有输入列(如电子表格)上旋转数据,那么您会更好为了简洁,可编程性和性能,坚持使用非标准化形式。

  

可能最终会出现一个需要梳理的巨大表格来查找具有所请求用户ID的行

假设您正确且明智地使用索引,现代RDBMS可以处理大量数据。这些索引允许查询只搜索它需要的数据,因此在一个表中保留所有数据通常会受到很少的惩罚。