我是sqlite的新手。我已经构建了数据库,但基于查询我试图解决它(过于复杂),我被建议调查规范化数据库,我做了,但似乎无法找到示例数据库,它将围绕像日记这样的日期,每天都有很多条目。我正在开发应用程序,这将有助于我每天登录我吃过的东西,我做了什么运动,我做了什么活动,我的幸福是什么,我有多少小时&#39我睡了我将能够回到过去的任何一天,看看我在做什么,所以它必须查找该特定日期的所有条目。
所以我理解我需要食物类型,运动类型,活动类型,事件类型的单独表格,我需要主表"日记"这将记录每个时间日期和id引用另一个表。所以我想知道在那个日记表中我是否可以有日期列,id列和让我们说类型列(它将区分哪个表的id列引用)或者我应该为每个其他每个列都有日期列和列表ids,即使我当时只记录一种类型?
另外,将日期列编入索引是一个好主意吗?
或许有更好的方法来设计该数据库?任何建议将不胜感激。
答案 0 :(得分:0)
所以我明白我需要食物类型,运动类型, 活动类型,事件类型
如果正常化,则可能会考虑所有类型的单个表,并使用列来指示类型。
所以我想知道在日记表中我是否可以有日期栏,id 列,让我们说类型列(将区分哪个表 是id列引用)还是我应该有日期列和 每个其他表id的列,即使我将记录 当时只有一种类型?
如果您正在记录并假设人工输入(而不是自动化),那么时间戳很可能足以唯一地标识行。 因此,几乎不需要id列(理论上 )。
说SQLite,除非你指定WITHOUT ROWID
(你可能会考虑,这可能用于决定: - Clustered Indexes and the WITHOUT ROWID Optimization ),自动创建一个唯一的行标识符列,即 ROWID < /强>
如果您将列编码为columnname INTEGER PRIMARY KEY
或columnname 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 )。
因此,使用此模型作为基础可以最小化列并自动编入索引。
SELECT * FROM log JOIN events WHERE eventref = _id
之类的查询会给出: - 注意!用于说明目的的时间戳