如何使用元数据

时间:2018-01-25 21:55:26

标签: sql database sqlite

所以我是一个SQL noobie,我想组织一个在SQLite中包含元数据和数据的结构化数据库。我不知道该怎么做,我在不同的网站环顾四周,但我没有找到任何有用的东西。

基本上我想要的是这样的(使用不同的数据采集站作为例子):

SQL TABLE:

  • 位置
  • Lat
  • 有关电台的其他重要信息

然后以某种方式,当我查询此表并希望查看有关特定站数据的信息时,我将能够提取看起来像这样的数据:

datetime    data
1/1/1980    11.6985
1/2/1980    43.6431
1/3/1980    54.9089
1/4/1980    63.1225
1/5/1980    72.4399
1/6/1980    79.1363
1/7/1980    82.2778
1/8/1980    86.0785
1/9/1980    86.8612
1/10/1980   84.3342
1/11/1980   80.4646
1/12/1980   77.1508
1/13/1980   74.827
1/14/1980   73.387
1/15/1980   72.1774
1/16/1980   71.6423

由于我对表层次结构知之甚少,我不知道如何做到这一点,但我觉得这可能是可能的。任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:1)

  

使用不同的数据收集站

立即指出应使用单独的电台表,并且读数应与电台表相关/相关/参考电台表。

对于电台表,您可以使用以下内容: -

CREATE TABLE IF NOT EXISTS stations (id INTEGER PRIMARY KEY, station_name TEXT, station_latitude REAL, station_longitude REAL);

这将创建一个包含4列的表(如果它尚不存在): -

  • 第一列 id 是一个唯一的标识符,它将自动生成,并且是您用来引用特定电台的唯一标识符。
  • 第二列 station_name 用于电台名称为TEXT。
  • 第三列和第四列用于根据lat和long的站点位置。

您可以使用以下方式添加几个电台: -

INSERT INTO stations (station_name, station_latitude,station_longitude) VALUES("Zebra", 100.7892, 60.789);
INSERT INTO stations (station_name, station_latitude,station_longitude) VALUES("Yankee", 200.2967, 95.234);

您可以使用以下方式显示/返回这些: -

SELECT * FROM stations
  • 即SELECT所有列(*)FROM表名为station,结果为: -

enter image description here

接下来,您可以创建读数表,例如: -

CREATE TABLE IF NOT EXISTS readings(recorded_datetime INTEGER DEFAULT (datetime('now')), data_recorded REAL, station_reference INTEGER);

这将创建一个名为readings的表(如果它还不存在),它将有3列: -

  • recorded_datetime,其类型为INTEGER(可以存储最多8个字节的整数,即非常大)。这将用于存储时间戳。虽然可能不是您想要的,但作为示例,将使用默认值,即当前日期时间,如果没有为此列指定值。
  • data_recorded as REAL for the data。
  • station_reference这将引用电台的id。

然后您可以使用以下方法为Zebra工作站插入读数: -

INSERT INTO readings (data_recorded,station_reference) VALUES(11.6985,1);

由于尚未提供record_datetime列,因此将使用当前日期时间。

如果: -

INSERT INTO readings VALUES(datetime('1980-01-01 10:40'),11.6985,1);

然后这个读数将是1980年1月1日10:40在第1站。

使用: -

INSERT INTO readings VALUES(datetime('1980-01-01 10:40'),13.6985,2);
INSERT INTO readings VALUES(datetime('1966-03-01 10:40'),15.6985,2);
INSERT INTO readings VALUES(datetime('2000-01-01 10:40'),11.6985,2);

将为Yankee电台添加一些读数(id 2)。

使用SELECT station_reference, recorded_datetime, data_recorded FROM READINGS;将选择所有列,但station_reference将是结果等中的第一列,例如: -

enter image description here

显而易见的进展是显示包括相应电台的数据。为此,将使用JOIN。也就是说,读数表将与站表连接,其中各个站的详细信息是根据与站的id匹配的station_refrence值。

但是,让我们说我们希望Station信息类似于 stationname(Long = ???? - Lat = ????)日期/时间数据 并根据电台名称进行排序,然后根据日期/时间进行排序。然后可以使用以下内容: -

SELECT 
        stations.station_name ||
            '(Long='||station_longitude||' - Lat='||station_latitude||')' 
        AS stationinfo, 
        readings.recorded_datetime,
        readings.data_recorded 
FROM readings 
JOIN stations ON readings.station_reference = stations.id
ORDER BY stations.station_name ASC, readings.recorded_datetime
  • 请注意,这更多地显示了一个示例,您可以在SQL中执行相当复杂的操作,而不是期望完全理解编码。

这将导致: -

enter image description here

你可能(或者有些人会)争论 ,但为什么我不能只有一个包含阅读,日期时间,电台名称,电台纬度,电台经度 的表格。

嗯,你可以。但是: -

  • 假设有一个更改站点Zebra名称的指令,那么你必须遍历所有行并更改名称多次。易于编码,但在资源使用方面相对昂贵。使用这两个表意味着只需要进行一次更新。
  • 对于每一行,您必须重复数据,这很可能浪费磁盘空间,从而增加访问数据所需的资源。那就是Zebra需要至少5个字节,Real需要8个字节(其中2个),这样就是21个字节。对重复数据的一次出现的引用对于整数(最初只是单个字节)最多需要8个字节。因此每次读取的成本为13个字节。