Database design 存储传感器测量数据的数据库方案

Database design 存储传感器测量数据的数据库方案,database-design,relational-database,Database Design,Relational Database,我想读取不同的生物传感器以及平板传感器数据,并将它们存储在SQL数据库中。生物传感器数据包括皮肤电导、心率、心率变异性等。这些只是带单位的数字。关于平板电脑传感器数据,我有触摸输入、加速度、前凸轮、触针输入等。基本上,除了触笔和前凸轮,这些也只是数字 关于SQL数据库方案,我考虑创建一个包含timestamp、user ID、tablet ID、sensor ID、unit和value列的表。关键是时间戳、用户ID、平板电脑ID、传感器ID,因为可以同时测量不同的传感器。我正在用平板电脑记录所有

我想读取不同的生物传感器以及平板传感器数据,并将它们存储在SQL数据库中。生物传感器数据包括皮肤电导、心率、心率变异性等。这些只是带单位的数字。关于平板电脑传感器数据,我有触摸输入、加速度、前凸轮、触针输入等。基本上,除了触笔和前凸轮,这些也只是数字

关于SQL数据库方案,我考虑创建一个包含timestamp、user ID、tablet ID、sensor ID、unit和value列的表。关键是时间戳、用户ID、平板电脑ID、传感器ID,因为可以同时测量不同的传感器。我正在用平板电脑记录所有传感器值以及生物传感器数据,因此始终有平板电脑ID。这也意味着数据库保存在平板电脑上。我用的是安卓系统

我不知道这些是否有意义。也许最好为每个传感器配备一个单独的表。你会如何制定这样一个计划,或者是否有另一个好计划的建议

第二,我应该如何存储手写笔输入和前摄像头录像?我想将录像存储在外部,而不是数据库中,然后以某种方式从数据库链接到该外部文件,例如通过文件名

将有大量数据要存储。我将在60分钟内收集传感器数据,并且每秒要写入几个值,例如,对于生物传感器数据,每1/10秒有一个新值。因此,数据库变得太大或太慢可能是一个问题。顺便说一下,我只想写入数据库。我将在第二个离线步骤中读取数据库。

我将倾向于为每个传感器创建一个单独的表。原因是:

看起来您通常不想一起分析不同传感器的数据,因为它们代表不同的事物。 您不必存储设备或传感器ID。如果您处理大量传感器读数,尤其是在存储空间有限的平板电脑环境中,存储节省可能会很大。 如果您试图高速插入来自多个不同传感器的记录,共享表可能会出现锁定问题。 我还将创建一个表来捕获与设备交互的一段时间。我们称之为会话

这将为其他表提供一个键,还允许您定义与该会话关联的视频和手写笔数据文件

所以你会有这样的想法:

session (
    session_id,
    user_id,
    tablet_id,
    video_file,
    stylus_data_file,
    session_start_time,
    session_end_time,
    ... any other session-level data ...
)
然后为每个传感器准备一张表,如:

heart_rate_readings (
    session_id,
    timestamp,
    value
)
注:我对手写笔数据了解不够,无法给出明智的意见。以上假设它将存储在一个单独的文件中。但是,如果它只是一个正在接收的坐标流,那么您也可以考虑将其存储在数据库中的一个单独的表中。

< P> >一些想法:

我假设每个传感器的数据总是使用相同的单位。也就是说,如果传感器7今天给出欧姆值,明天就不会给出毫米值。更合理的是,我认为可能会有一些设置允许您在英寸和厘米等之间切换。但如果单位始终相同,则不要将单位与值存储在同一个表中。有一个单独的传感器表,给出传感器的单位,可能还有关于传感器的其他信息,比如名称

是每个传感器有一个表还是每个传感器有一个单独的表:一个表的最大优点是,如果您添加一个新传感器,您不必更改模式,它只是数据:向传感器表添加一条记录,您就完成了。如果有很多数据,这个表可能会变得很大。但每个记录都很小:我想传感器ID和平板电脑ID可以是int。用户ID可以是int或guid


我从未尝试过将视频存储在数据库中。我存储了图像,这些图像与其他数据相比是巨大的。视频通常至少为兆字节。我的直觉是将它们存储为单个文件,只存储一个文件名。我很乐意向任何真正尝试过将视频放入DB并能说出结果的人让步。

您的桌子甚至需要钥匙吗?大概您只是存储了大量数据,而这些数据不会从任何其他表引用…@RB。是的,只有一个表,我不需要键,但正如我所写的,我正在寻找一个具有多个表的更好方案。@dan1111手写笔和前cam输入不仅仅是数字。您最好使用NoSQL数据库,如MongoDB。您基本上希望保存一堆完全不同的数据,这些数据共享一点点元数据…@RB。我不得不说,我想把所有东西都存储在Android平板电脑上,而MongoDB不适用于Android。非常感谢您的回答。我应该使用事务吗?如果是,何时提交,还是应该将每个传感器读数放入一个事务中?第二,我应该使用
每个传感器都有一个线程,用于处理新行的数据库插入?每个传感器的不同表是糟糕的数据库设计。它只是不可扩展,甚至在几个传感器都有管理开销之后。我应该使用事务吗?如果是,什么时候提交,还是应该将每个传感器读数放入一个事务中?第二,我应该为处理新行数据库插入的每个传感器使用一个线程吗?我猜传感器读数是独立有效的。我的意思是,如果你得到了心率,但由于某种原因系统无法获得血压,那么心率可能仍然是一个很好的有用的测量方法。假设这是真的,它们不应该是交易。如果有一些读数只有放在一起才有意义,那么就可能有交易的情况。使用事务处理的正常原因是为了防止出现不一致的状态,例如试图在两个帐户之间转账,因此您从一个帐户中减去,但在尝试向另一个帐户添加时失败,因此现在的钱。。。。。。重复使用线程:我不认为线程是必要的或有用的内在原因。出于性能方面的原因,它可能是好的。如何获取传感器读数?它们是中断吗?你必须投票吗?这涉及到关于您使用的语言和操作系统的各种问题,这与数据库是完全不同的问题。我在Android上使用SQLLite。我读到的是,同一时间只能有一个数据库连接,即所有线程必须共享同一个连接。我通过中断事件获取传感器读数,我不必轮询。当然,只有一个db连接是一个瓶颈。