设计面向日期的数据库sqlite

时间:2017-08-12 20:12:49

标签: android database sqlite android-sqlite

我是sqlite的新手。我已经构建了数据库,但基于查询我试图解决它(过于复杂),我被建议调查规范化数据库,我做了,但似乎无法找到示例数据库,它将围绕像日记这样的日期,每天都有很多条目。我正在开发应用程序,这将有助于我每天登录我吃过的东西,我做了什么运动,我做了什么活动,我的幸福是什么,我有多少小时&#39我睡了我将能够回到过去的任何一天,看看我在做什么,所以它必须查找该特定日期的所有条目。

所以我理解我需要食物类型,运动类型,活动类型,事件类型的单独表格,我需要主表"日记"这将记录每个时间日期和id引用另一个表。所以我想知道在那个日记表中我是否可以有日期列,id列和让我们说类型列(它将区分哪个表的id列引用)或者我应该为每个其他每个列都有日期列和列表ids,即使我当时只记录一种类型?

另外,将日期列编入索引是一个好主意吗?

或许有更好的方法来设计该数据库?任何建议将不胜感激。

1 个答案:

答案 0 :(得分:0)

  

所以我明白我需要食物类型,运动类型,   活动类型,事件类型

如果正常化,则可能会考虑所有类型的单个表,并使用列来指示类型。

  

所以我想知道在日记表中我是否可以有日期栏,id   列,让我们说类型列(将区分哪个表   是id列引用)还是我应该有日期列和   每个其他表id的列,即使我将记录   当时只有一种类型?

如果您正在记录并假设人工输入(而不是自动化),那么时间戳很可能足以唯一地标识行。 因此,几乎不需要id列(理论上 )。

说SQLite,除非你指定WITHOUT ROWID(你可能会考虑,这可能用于决定: - Clustered Indexes and the WITHOUT ROWID Optimization ),自动创建一个唯一的行标识符列,即 ROWID < /强>

如果您将列编码为columnname INTEGER PRIMARY KEYcolumnname INTEGER PRIMARY KEY AUTOINCREMENT,则columnname将成为ROWID的别名,在这种情况下,如果您不是{1}},则会提供唯一值插入时提供一个值。

但是,如果您要指定timestamp INTEGER PRIMARY KEY并在插入时将当前日期/时间作为列的值提供,则会存储当前日期/时间并将其编入索引(必须是独特的(当前日期/时间很可能是))。

所以我建议日志条目只需CREATE TABLE log (timestamp INTEGER PRIMARY KEY, eventref INTEGER);,其中eventref是对事件类型的引用。

有时需要 _id ,例如对于CursorAdapter,您可以指定要提取的列为*, timestemp as _id 3列时间戳,eventref和_id(时间戳和_id将相同))或timstemp as _id, *(< em> 3列,但_id,timestamp和eventref )或timestamp as _id, eventref 2列_id和eventref )。

因此,使用此模型作为基础可以最小化列并自动编入索引。

一个例子

您可以将事件表格显示为: -

enter image description here

与日志表一起: -

enter image description here

SELECT * FROM log JOIN events WHERE eventref = _id之类的查询会给出: -

enter image description here

注意!用于说明目的的时间戳