【发布时间】:2011-07-25 09:16:43
【问题描述】:
我对存储大量数据有疑问。情况如下:
-
我要收藏
- GPS 坐标(纬度和经度)(每分钟甚至更短的间隔,但我正在考虑每分钟)
- 事件,可以在多个坐标中重复
- 输入的日期时间或时间戳(不知道在我的情况下哪个更好用)
- (用户 ID)
-
我希望能够查询:
- 按区域划分事件(定义经纬度范围,例如从 (1,1) 到 (2,2))
- 从日期 X 到日期 Y 的用户跟踪(一个或多个用户)
到目前为止,我正在考虑解决方案:
解决方案 1
id_user (int)
id_experince (int)
id_event (int)
dt (datetime)
latitude (decimal)
longitude (decimal)
我开始进行一些计算,结果类似于: - 每天/用户大约 500 个条目 - 因为我正在为一些负载准备应用程序,所以可能有大约 100-150 个用户,这将是 75000 个条目/天 - 一个月后将有数百万条条目
可能解决方案1不是很好的解决方案,因为数据库的大小增长非常快。
解决方案 2
有 2 个表,其中一个是根据事件的聚合坐标,例如我有事件“晚餐”,它需要 30 分钟,所以 30 个条目将被分组到一个 BLOB 类型的字段中。该表将如下所示:
id_user (int)
id_experience (int)
id_event (int)
dt (datetime)
coordinates(blob)
另一个表,它已经计算了一些“宽度”和“长度”的位置,并具有指向第一个表的指针
latitude (decimal)
longitude (decimal)
id_entry_in_first_table (int)
这个解决方案只是部分解决了我的问题,想象一下,有些事件不会超过几分钟,并且需要第二个数据库..
解决方案 3
这可能不是非常正确的解决方案,但似乎有些道理。我有用户与某种体验相关联,它有开始日期和结束日期。当体验添加时,我将为该体验创建数据转储并保存到文件中,删除与体验相关的条目。当用户想咨询“存档”体验时,我会在一天之内(例如)将数据加载到某个临时表中并删除,这种情况下我将按照解决方案1保存数据。
主要问题是:就数据库性能而言,所提出的解决方案是否可以接受?我的问题有更好的解决方案吗?
【问题讨论】:
-
Float 是一种非常糟糕的数据类型,不适合用于 lat long。它不准确,会导致距离计算不正确。使用带有预先定义的小数位的小数。
-
mySQL 有空间数据类型吗?这就是你应该使用的。
-
目前我用十进制设计了数据库,很抱歉浮点数,它是伪代码:) 但还是感谢您的提前。
标签: mysql database database-design